如何从Django shell执行Python脚本?

224 python django django-shell

我需要从Django shell执行Python脚本.我试过了:

./manage.py shell << my_script.py
Run Code Online (Sandbox Code Playgroud)

但它没有用.它只是在等我写点什么.

cod*_*ape 352

<<部分是错误的,<改为使用:

$ ./manage.py shell < myscript.py
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

$ ./manage.py shell
...
>>> execfile('myscript.py')
Run Code Online (Sandbox Code Playgroud)

对于python3,您需要使用

>>> exec(open('myscript.py').read())
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,这只执行脚本的第一行.唯一有效的方法是结合两种方法:`./manage.py shell << EOF\execfile('myscript.py')\ EOF` (16认同)
  • 另一个似乎适用于Python 2.x和3.x的解决方案是`echo'import myscript'| python manage.py shell`.我发现这对于只需要运行一次的快速和脏脚本非常有用,而无需经历创建`manage.py`命令的繁琐过程. (8认同)
  • @DavidD.这个答案给出了替换[这里](http://stackoverflow.com/questions/436198/what-is-an-alternative-to-execfile-in-python-3-0) (4认同)
  • 如果您在 Windows power shell 上执行此操作:`Get-Content myscript.py | .\manage.py shell` (2认同)

dan*_*van 206

你不建议你这样做shell- 这是因为你不应该真正从django环境中执行随机脚本(但是有很多方法可以解决这个问题,请参阅其他答案).

如果这是一个您将多次运行的脚本,最好将其设置为自定义命令,

 $ ./manage.py my_command
Run Code Online (Sandbox Code Playgroud)

要做到这一点management,commands在你的子目录中创建一个文件app,即

my_app/
    __init__.py
    models.py
    management/
        __init__.py
        commands/
            __init__.py
            my_command.py
    tests.py
    views.py
Run Code Online (Sandbox Code Playgroud)

并在此文件中定义您的自定义命令(确保文件的名称是您要执行的命令的名称./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
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案.由于django 1.8`NoArgsCommand`已被弃用.此页面提供了一个工作示例:https://docs.djangoproject.com/en/1.9/howto/custom-management-commands/#module-django.core.management (9认同)
  • 根据之前的评论,要使它对我有用,我需要将def handle_noargs(self,** options):更改为def handle(self,** options):。 (2认同)

小智 94

对于任何使用Django 1.7+的人来说,似乎只是导入设置模块是不够的.

经过一番挖掘,我发现这个Stack Overflow回答:https://stackoverflow.com/a/23241093

你现在需要:

import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
# now your code can go here...
Run Code Online (Sandbox Code Playgroud)

没有做到这一点,我收到了一个django.core.exceptions.AppRegistryNoReady错误.

我的脚本文件与我的django项目位于同一目录中(即与manage.py位于同一文件夹中)

  • 使用 django 1.7+,这应该是公认的答案:) (3认同)
  • 我的设置中已经在`DJANGO_SETTINGS_MODULE`环境变量中引用了设置文件.有了这个就足够了:`import django; django.setup()`1.7以下. (2认同)
  • 你让我今天一整天都感觉很好!谢谢你的帖子。我对芹菜很着迷,因为我无法将任务执行到 management.call_command :D :D :D (2认同)

e-n*_*uri 66

我迟到了,但我希望我的回复会帮助别人:你可以在你的Python脚本中做到这一点:

import sys, os
sys.path.append('/path/to/your/django/app')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings
Run Code Online (Sandbox Code Playgroud)

你剩下的东西都来了......

  • 还要注意,只要你的'DJANGO_SETTINGS_MODULES'正确就可以删除`sys.path.append`东西(例如,如果你的脚本位于你的站点根上方,你可以做`os.environ ['DJANGO_SETTINGS_MODULE'] = "mysite.settings'`). (3认同)

Cir*_*四事件 27

runscript来自django-extensions

python manage.py runscript scripty.py
Run Code Online (Sandbox Code Playgroud)

script.py测试它的样本:

from django.contrib.auth.models import User
print(User.objects.values())
Run Code Online (Sandbox Code Playgroud)

提及时间:http://django-extensions.readthedocs.io/en/latest/command_extensions.html并记录在:

python manage.py runscript --help
Run Code Online (Sandbox Code Playgroud)

还有一个教程.

测试了Django 1.9.6,django-extensions 1.6.7.


git*_*rik 11

如果IPython可用(pip install ipython)然后./manage.py shell会自动使用它的shell然后你可以使用magic命令%run:

%run my_script.py
Run Code Online (Sandbox Code Playgroud)


Md.*_*que 10

我参加聚会迟到了,但我希望我的回答能对某人有所帮助:您可以在 Python 脚本中执行此操作:

第1步: 导入

import mysite.asgi
Run Code Online (Sandbox Code Playgroud)

步骤2: 需要执行Python脚本,只需输入:

python test.py
Run Code Online (Sandbox Code Playgroud)

其中 test.py文件如下所示:

import mysite.asgi

from polls.models import GMD_TABLE
print ( [obj.gt_GMD_name for obj in GMD_TABLE.objects.all()] )
Run Code Online (Sandbox Code Playgroud)

最后: 结果将是:

['ISHWARDI', 'JHENAIDHA', 'HVDC CIRCLE']
Run Code Online (Sandbox Code Playgroud)

其中['ISHWARDI', 'JHENAIDHA', 'HVDC CIRCLE']是 GMD_TABLE 的值


zii*_*ima 8

您可以使用DJANGO_SETTINGS_MODULE环境变量集运行脚本.这就是设置Django-shell环境所需的全部内容.

这适用于Django> = 1.4


rar*_*iru 5

@AtulVarma在无法接受的答案下提供了非常有用的评论:

echo 'import myscript' | python manage.py shell
Run Code Online (Sandbox Code Playgroud)


小智 5

正如其他答案所指出但没有明确说明的那样,您可能实际需要的不一定是从 Django shell 执行您的脚本,而是在不使用 Django shell 的情况下访问您的应用程序。

这与 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
Run Code Online (Sandbox Code Playgroud)

然后跑了 python3 my_command.py

(Django 2.0.2)


小智 5

如果脚本中没有很多命令,请使用它:

manage.py shell --command="import django; print(django.__version__)"
Run Code Online (Sandbox Code Playgroud)

Django文档


小智 5

您可以简单地运行:

python manage.py shell < your_script.py

它应该可以完成这项工作!