我需要从Django Shell执行Python脚本。我试过了:
./manage.py shell << my_script.py
但这没有用。只是在等我写东西。
我需要从Django Shell执行Python脚本。我试过了:
./manage.py shell << my_script.py
但这没有用。只是在等我写东西。
Answers:
该<<
部分有误,请<
改用:
$ ./manage.py shell < myscript.py
您也可以这样做:
$ ./manage.py shell
...
>>> execfile('myscript.py')
对于python3,您需要使用
>>> exec(open('myscript.py').read())
./manage.py shell <<EOF\ execfile('myscript.py') \EOF
echo 'import myscript' | python manage.py shell
。我发现这对于快速脏的脚本很有用,您只需要运行一次即可,而不必经历创建manage.py
命令的繁琐过程。
Get-Content myscript.py | .\manage.py shell
你不建议这样做,从shell
-这是为了你真不该从Django的环境中执行随机脚本(但也有是解决这个办法,看到其他的答案)。
如果您要多次运行该脚本,则最好将其设置为自定义命令,即
$ ./manage.py my_command
要做到这一点创建一个子目录文件management
和commands
你的app
,即
my_app/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
my_command.py
tests.py
views.py
并在此文件中定义您的自定义命令(确保文件名是您要从执行的命令的名称./manage.py
)
from django.core.management.base import BaseCommand
class Command(BaseCommand):
def handle(self, **options):
# now do the things that you want with your models here
NoArgsCommand
已被弃用。该页面提供了一个工作示例:docs.djangoproject.com/en/1.9/howto/custom-management-commands/...
def handle_noargs(self, **options):
为def handle(self, **options):
。
def handle(self, **options):
James的评论。
对于使用Django 1.7+的任何人,似乎仅仅导入settings模块是不够的。
经过一番挖掘,我找到了这个堆栈溢出的答案:https : //stackoverflow.com/a/23241093
您现在需要:
import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
# now your code can go here...
没有执行上述操作,我得到了一个django.core.exceptions.AppRegistryNoReady
错误。
我的脚本文件与django项目位于同一目录(即,与manage.py位于同一文件夹)
DJANGO_SETTINGS_MODULE
环境变量中引用了设置文件。这样就足够了:import django ; django.setup()
低于1.7。
django.setup()
不会让脚本访问Django模型,甚至不会导入它们!
import django; django.setup()
。
我参加聚会很晚,但希望我的回复对某人有帮助:您可以在Python脚本中执行以下操作:
import sys, os
sys.path.append('/path/to/your/django/app')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings
其余的东西都在这里....
sys.path.append
只要您DJANGO_SETTINGS_MODULES
正确就可以删除内容(例如,如果脚本位于站点根目录的上方,则可以这样做os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
)。
sys.path.append(os.getcwd())
,它的工作原理,当我为我的项目目录里面,我DJANGO_SETTINGS_MODULE是正确的,我试图将其导入模型,视图等运行脚本
runscript
来自django-extensions
python manage.py runscript scripty.py
一个样本script.py
进行测试:
from django.contrib.auth.models import User
print(User.objects.values())
提及于:http : //django-extensions.readthedocs.io/en/latest/command_extensions.html,并记录在:
python manage.py runscript --help
在Django 1.9.6和django-extensions 1.6.7上进行了测试。
django-extensions
(应该),这是最好的答案。注意:看起来像runscript
使用标准的django shell
。如果使用它shell_plus
(也是在扩展名中),那就太棒了,这样您就不必为简单的脚本导入所有内容。
正如其他答案指出但未明确指出的那样,您实际需要的不一定是从Django Shell执行脚本,而是在不使用Django Shell的情况下访问应用程序。
Django版本与Django版本有很大不同。如果在该线程上找不到解决方案,请在此处回答 -Django脚本无需使用manage.py shell即可访问模型对象 -或类似的搜索可能会对您有所帮助。
我必须以my_command.py开始
import os,sys
sys.path.append('/path/to/myproject')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.file")
import django
django.setup()
import project.app.models
#do things with my models, yay
然后跑 python3 my_command.py
(Django 2.0.2)
sys.path.append('/path/to/myproject')
用BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
和`sys.path.append(BASE_DIR)`。同样不要忘记在执行命令之前激活虚拟环境!
我刚刚发现有趣的是Django Scripts,它允许您编写要使用python manage.py runscript foobar运行的脚本。有关实现和结构的更多详细信息,请参见http://django-extensions.readthedocs.org/en/latest/index.html
如果您使用的是虚拟环境,请尝试以下操作:
python manage.py shell
要使用这些命令,您必须位于虚拟环境中。为此用途:
工作vir_env_name
例如 :-
dc@dc-comp-4:~/mysite$ workon jango
(jango)dc@dc-comp-4:~/mysite$ python manage.py shell
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
注意:-这里的mysite是我的网站名称,而jango是我的虚拟环境名称
另一种执行此方法的方法:
echo 'execfile("/path_to/myscript.py")' | python manage.py shell --settings=config.base
这适用于Python2.7和Django1.9
django shell是在django环境中执行python模块的好方法,但是手动导入模块和执行函数并不总是那么容易且麻烦,尤其是在没有自动完成的情况下。为了解决这个问题,我创建了一个小的shell脚本“ runscript.sh”,使您可以充分利用Linux控制台的自动完成功能和日志历史记录。
注意:将runscript.sh复制到根项目并设置执行权限(chmod + x)
例如:我想在myapp / do_folder /中的do_somethings.py模块中运行名为show(a,b,c)的python函数。
django的标准方式(manage.py shell):
python3 manage.py shell
> from myapp.do_folder import do_somethings
> do_somethings.show("p1", "p2" , 3.14159)
使用脚本(runscript.sh):
./runscript.sh myapp/do_folder/do_somethings.py show p1 p2 3.14159
脚本的参数数量不受限制。但是,仅支持基本类型的参数(int,float,string)
django.setup()似乎不起作用。
似乎也不是必需的。
仅此而已。
import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")
django
工作的,您实际上想做什么?