如何从Django Shell执行Python脚本?


Answers:


388

<<部分有误,请<改用:

$ ./manage.py shell < myscript.py

您也可以这样做:

$ ./manage.py shell
...
>>> execfile('myscript.py')

对于python3,您需要使用

>>> exec(open('myscript.py').read())

17
对我来说,这仅执行脚本的第一行。唯一有效的方法是将两种方法结合起来:./manage.py shell <<EOF\ execfile('myscript.py') \EOF
史蒂夫·贝内特

它在Python 3+中不再起作用。有什么想法要替换吗?
David D.

4
@DavidD。替换在此给出的答案在这里
peter2108

11
似乎适用于Python 2.x和3.x的另一种解决方案是echo 'import myscript' | python manage.py shell。我发现这对于快速脏的脚本很有用,您只需要运行一次即可,而不必经历创建manage.py命令的繁琐过程。
Atul Varma

1
如果您在Windows Power Shell上执行此操作: Get-Content myscript.py | .\manage.py shell
Aditya Wirayudha

219

你不建议这样做,从shell-这是为了你真不该从Django的环境中执行随机脚本(但也有解决这个办法,看到其他的答案)。

如果您要多次运行该脚本,则最好将其设置为自定义命令,

 $ ./manage.py my_command

要做到这一点创建一个子目录文件managementcommands你的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

9
同样,这是最好的答案。由于django 1.8 NoArgsCommand已被弃用。该页面提供了一个工作示例:docs.djangoproject.com/en/1.9/howto/custom-management-commands/...
GER

2
根据之前的评论,要使其对我有用,我需要更改def handle_noargs(self, **options):def handle(self, **options):
詹姆斯

有趣的链接在这里支持此答案和文档。
Mattia Paterna

1
为了使其正常工作,请改为def handle(self, **options):James的评论。
奥马尔·冈萨雷斯

优雅的答案。非常感谢
Tessaracter

103

对于使用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位于同一文件夹)


2
我的安装程序已经在DJANGO_SETTINGS_MODULE环境变量中引用了设置文件。这样就足够了:import django ; django.setup()低于1.7。
泰勒·埃德米斯顿

1
使用django 1.7+,这应该是公认的答案:)
acidjunk

这绝对是Django 1.9.x的正确答案。不运行django.setup()不会让脚本访问Django模型,甚至不会导入它们!
glarrain

在virtualenv中,您可以简单地进行操作import django; django.setup()
User3759685

1
你让我今天一整天都感觉很好!感谢这篇文章。我无法在芹菜上抓狂,因为我无法将任务执行到management.call_command:D:D:D

68

我参加聚会很晚,但希望我的回复对某人有帮助:您可以在Python脚本中执行以下操作:

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

其余的东西都在这里....


3
还要注意,sys.path.append只要您DJANGO_SETTINGS_MODULES正确就可以删除内容(例如,如果脚本位于站点根目录的上方,则可以这样做os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings')。
mgalgs 2014年

我落得这样做sys.path.append(os.getcwd()),它的工作原理,当我为我的项目目录里面,我DJANGO_SETTINGS_MODULE是正确的,我试图将其导入模型,视图等运行脚本
达尼洛·卡韦略

是的,但是你不能从任何地方运行它!
e-nouri 2014年

对于Django 1.6,这对我不起作用-我有一个应用。我已经设置了包含django项目目录的路径,并设置了项目设置。但是,当我尝试使用“从shoppinglist.models import ShoppingList”导入我的应用程序时,出现错误,提示它找不到模型。相同的导入行在manage.py shell中起作用。有任何想法吗?
弗兰克斯特

33

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上进行了测试。


1
如果您已经在使用django-extensions(应该),这是最好的答案。注意:看起来像runscript使用标准的django shell。如果使用它shell_plus(也是在扩展名中),那就太棒了,这样您就不必为简单的脚本导入所有内容。
grokpot

12

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

%run my_script.py

像魅力一样工作!
Roel

这样做的好处runscript是,它可以与项目/程序包外部的脚本一起使用,并且不会像这样抱怨TypeError: the 'package' argument is required to perform a relative import for
smido

8

您可以仅在DJANGO_SETTINGS_MODULE设置了环境变量的情况下运行脚本。这就是设置Django-shell环境所需的全部。

这适用于Django> = 1.4


7

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

echo 'import myscript' | python manage.py shell

好答案!我在评论中错过了它。感谢您把它
放到

6

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

manage.py shell --command="import django; print(django.__version__)"

Django文档


4

正如其他答案指出但未明确指出的那样,您实际需要的不一定是从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)


这仍然适用于Django 3.0。我换成sys.path.append('/path/to/myproject')BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))和`sys.path.append(BASE_DIR)`。同样不要忘记在执行命令之前激活虚拟环境!
mrj

3
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())

django.setup()

1
你能请编辑在为什么这个代码回答这不同于一些非常相似的早期答案的方式问题的解释?不鼓励仅使用代码的答案,因为它们没有教导解决方案。
内森·塔吉

2

请注意,此方法已被django的最新版本淘汰!(> 1.3)

一个替代答案,您可以将其添加到 my_script.py

from django.core.management import setup_environ
import settings
setup_environ(settings)

my_script.py仅在您所在的目录中使用python 执行,settings.py但这有点麻烦。

$ python my_script.py

1

如果您想更好地在BG中运行:

nohup echo 'exec(open("my_script.py").read())' | python manage.py shell &

输出将在 nohup.out



0

如果您使用的是虚拟环境,请尝试以下操作:

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是我的虚拟环境名称


0

来到这里的是与OP相同的问题,我发现我最喜欢的答案恰好是问题中的错误,这在Python 3中也适用:

./manage.py shell <<EOF
import my_script
my_script.main()
EOF

0

另一种执行此方法的方法:

echo 'execfile("/path_to/myscript.py")' | python manage.py shell --settings=config.base

这适用于Python2.7和Django1.9


0

如果要执行启动脚本(例如,导入一些django模型以交互方式使用它们)并保留在django shell中:

PYTHONSTARTUP=my_script.py python manage.py shell

0

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)


嗨,可能是runscriptdjango-extensions包装做的一样,检查它django-extensions.readthedocs.io/en/latest/runscript.html
frost-nzcr4

谢谢frost-nzcr4。是的,确实,此扩展名有效,但我发现它仅限于srcipts文件夹,仅限于run()函数。使用我的脚本,您可以在任何文件夹中的任何位置执行功能。
Martin13

0

晚会。但这可能对某人有用。

您只需要脚本并django-extensions安装。

只需运行shell_plus可用的django_extensions并导入您编写的脚本即可。

如果脚本scpt.py位于文件夹中fol,则可以按以下方式运行脚本。

python manage.py shell_plus

并按如下所示将您的脚本导入外壳。

>>> from fol import scpt

-1

django.setup()似乎不起作用。

似乎也不是必需的。

仅此而已。

import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")

1
当然,django.setup()是引导Django环境所必需的。
colm.anseo '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.