我需要从Django shell中执行一个Python脚本。我尝试了:
./manage.py shell << my_script.py
但是它没有起作用。它只是在等我写点什么。
我需要从Django shell中执行一个Python脚本。我尝试了:
./manage.py shell << my_script.py
但是它没有起作用。它只是在等我写点什么。
这里的<<
部分是错误的,应该使用<
代替:
$ ./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
。 - Steve Bennettmyscript.py
? - Sean LetendreGet-Content myscript.py | .\manage.py shell
- Aditya Wirayudha从 shell
中执行随机脚本并不被推荐 - 这是有意为之的,因为你不应该在 Django 环境中执行随机脚本(但是还有其他方法可以绕过此限制,请参见其他答案)。
如果这是一个需要多次运行的脚本,则将其设置为自定义命令是个好主意。
$ ./manage.py my_command
为此,在您的app
的management
和commands
子目录中创建一个文件,例如:
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
def handle_noargs(self, **options):
更改为def handle(self, **options):
。 - Jamesdef handle(self, **options):
。 - Omar Gonzales对于使用Django 1.7+的任何人来说,似乎仅仅导入设置模块是不够的。
在一些挖掘之后,我找到了这个Stack Overflow答案:https://dev59.com/kmEh5IYBdhLWcg3wKQnY#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
环境变量中引用了设置文件。只需要在1.7版本下执行import django; django.setup()
即可。 - Taylor D. Edmistondjango.setup()
将无法让脚本访问Django模型,甚至无法导入它们! - glarrainimport sys
和sys.path.insert(0, ".")
以及sys.path.insert(0, "../lib")
或类似的内容,以便能够访问位于起始目录之外的不同位置的库。设置模块名称只是路径上到settings.py
的目录名称,用.
而不是/
分隔。 - NeilG虽然我来晚了,但我希望我的回答能帮助到某些人: 您可以在Python脚本中执行此操作:
import sys, os
sys.path.append('/path/to/your/django/app')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings
您的其余内容放在此处...
DJANGO_SETTINGS_MODULE
(例如,如果你有一个在站点根目录上面的脚本,你可以使用 os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
),就不需要再添加 sys.path.append
的内容。 - mgalgssys.path.append(os.getcwd())
,这样在我进入我的项目目录、我的DJANGO_SETTINGS_MODULE正确并且我尝试运行一个导入models、views等的脚本时会有效。 - Danilo Cabellorunscript
from 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
(也在扩展中),那将是非常棒的,这样您就不必为简单的脚本导入所有内容了。 - grokpot@AtulVarma在不工作的被接受的答案下提供了非常有用的评论:
echo 'import myscript' | python manage.py shell
cat ./my_script.py | python manage.py shell
- ddelange如果你的脚本中没有太多的命令,可以使用-c
/--command
:
manage.py shell --command "import django; print(django.__version__)"
python manage.py shell --command="\
cat script_name.py`"` - wile_e8虽然我来晚了,但我希望我的回答能帮到某个人:
步骤1:导入
import mysite.asgi
步骤二:只需输入以下命令即可执行 Python 脚本:
python test.py
假设 test.py 文件长这样:
import mysite.asgi
from polls.models import GMD_TABLE
print ( [obj.gt_GMD_name for obj in GMD_TABLE.objects.all()] )
最终结果: The result will be:
['ISHWARDI', 'JHENAIDHA', 'HVDC CIRCLE']
['ISHWARDI', 'JHENAIDHA', 'HVDC CIRCLE']是GMD_TABLE的值。
您只需设置环境变量DJANGO_SETTINGS_MODULE
并运行脚本即可。这就是设置Django shell环境所需的全部步骤。
在Django >= 1.4中适用。
django
的工作方式,你实际上想要做什么? - danodonovanmy_script.py
包含了一些对我 Django 模型的操作。我之前已经做过这些操作,但是我不太记得具体怎么做了。 - user2429940