如何从Django shell执行Python脚本?

我需要从Django shell中执行一个Python脚本。我试着:

./manage.py shell << my_script.py

但这并没有起作用。它只是在等我写点什么。

304759 次浏览

不建议你从shell中这样做——这是因为你不应该从django环境中执行随机脚本(但是有方法来解决这个问题,请参阅其他答案)。

如果这是一个你将运行多次的脚本,将其设置为__abc0ie是个好主意

 $ ./manage.py my_command

要做到这一点,在你的appmanagementcommands的子目录下创建一个文件

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

<<部分是错误的,使用<代替:

$ ./manage.py shell < myscript.py

你还可以:

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

对于python3,您需要使用

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

__abc0 (> 1.3)

另一个答案是,你可以把它添加到my_script.py的顶部

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

并在settings.py所在的目录中使用python执行my_script.py,但这有点棘手。

$ python my_script.py

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

这在Django >= 1.4中是有效的

我迟到了,但我希望我的回答能帮助到别人: 你可以在你的Python脚本中这样做:

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

你的其他东西在这里....

我刚刚发现一个有趣的东西是Django Scripts,它允许你用python manage.py runscript foobar来编写脚本。关于实现和结构的更详细信息可以在这里找到,http://django-extensions.readthedocs.org/en/latest/index.html

对于使用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...

如果不执行上述操作,我将得到一个django.core.exceptions.AppRegistryNoReady错误。

我的脚本文件是在相同的目录,我的django项目(即。和manage.py在同一个文件夹中)

Django.setup()似乎不能正常工作。

似乎也不是必须的。

仅这一点就奏效了。

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

如果你正在使用虚拟环境,试试这个:-

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

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


django.setup()

runscript 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上测试。

@AtulVarma在not-working 接受的答案下提供了一个非常有用的注释:

echo 'import myscript' | python manage.py shell

如果IPython可用(pip install ipython),那么./manage.py shell将自动使用它的shell,然后你可以使用神奇的命令%run:

%run my_script.py

正如其他答案所指出但没有明确指出的那样,你可能实际上需要的不一定是从Django shell中执行脚本,而是访问你的应用不使用Django shell

Django版本和Django版本之间有很大的不同。如果你在这篇文章中没有找到你的解决方案,答案在这里—— 不使用manage.py shell访问模型对象的Django脚本 ——或者类似的搜索可能会帮助你

我必须以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)

如果你想在BG中更好地磨合:

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

输出将在nohup.out

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

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

Django docs on manage.py shell

我带着与OP相同的问题来到这里,而我恰恰在问题中的错误中找到了我最喜欢的答案,这在Python 3中也适用:

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

另一种方式是执行这个

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

它在Python2.7和Django1.9上运行

如果你想执行启动脚本(例如,导入一些django模型来与它们交互工作),并保持在django shell中:

PYTHONSTARTUP=my_script.py python manage.py shell

django shell是在django环境中执行python模块的好方法,但是手动导入模块和执行函数并不总是那么容易和烦人,尤其是在没有自动补全的情况下。为了解决这个问题,我创建了一个小shell脚本“runscript.sh”,它允许你充分利用Linux控制台的自动补全和日志历史。

注意:拷贝runscript.sh到根项目并设置执行权限(chmod +x)

例如< p >: 我想在myapp/do_folder/

的do_things .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-extensions安装。

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

如果你的脚本是scpt.py,并且它在文件夹fol中,你可以像下面这样运行脚本。

python manage.py shell_plus

然后在shell中导入脚本,如下所示。

>>> from fol import scpt

我迟到了,但我希望我的回答能帮助到别人:你可以在你的Python脚本中这样做:

步骤1: 进口

import mysite.asgi

步骤2: 需要执行一个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()] )

终于: 结果将是:

['ISHWARDI', 'JHENAIDHA', 'HVDC CIRCLE']

其中[' ishwardi ', ' jhenaidha ', ' hvdc circle ']是GMD_TABLE的值

首先检查你的文件。

py manage.py

如果显示您的文件

[contracts]
category_load

现在您可以通过输入powershell(terminal)来运行.py文件

py manage.py category_load
其实很简单,只要你打开django shell python manage.py shell
然后直接写入
import test
导入test.py

# test.py
def x():
print('hello');

现在您可以执行该文件中的命令

test.x() //  will print hello

你可以简单地运行:

python manage.py shell < your_script.py

它应该做到这一点!

在import语句后放置全局变量().update(当地人())