318

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

./manage.py shell << my_script.py

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

4

23 回答 23

485

<<部分是错误的,请<改用:

$ ./manage.py shell < myscript.py

你也可以这样做:

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

对于 python3,您需要使用

>>> exec(open('myscript.py').read())
于 2013-05-31T09:13:21.933 回答
266

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

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

 $ ./manage.py my_command

为此,在您的management和的子目录中创建一个文件,即commandsapp

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
于 2013-05-31T09:10:48.557 回答
119

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

于 2014-06-27T16:14:14.990 回答
72

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

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

你剩下的东西都放在这里....

于 2013-10-17T12:27:33.103 回答
42

runscript来自django 扩展

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

于 2016-06-05T10:10:42.567 回答
13

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

%run my_script.py
于 2016-12-15T10:44:07.993 回答
10

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

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

Django 文档

于 2018-07-18T14:41:38.950 回答
9

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

echo 'import myscript' | python manage.py shell
于 2016-11-03T13:03:36.380 回答
8

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

这适用于 Django >= 1.4

于 2013-05-31T13:42:31.763 回答
6

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

这与 Django 版本有很大不同。如果您在此线程上找不到您的解决方案,请在此处回答 - Django script to access model objects without using 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)

于 2018-02-21T21:31:04.500 回答
5

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

第一步: 导入

import mysite.asgi

step2: 需要执行一个 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 的值

于 2021-06-09T11:07:36.383 回答
3

请注意,对于更新的 django 版本,此方法已被弃用!(> 1.3)

另一个答案,您可以将其添加到顶部my_script.py

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

my_script.py在您拥有的目录中使用 python执行,settings.py但这有点 hacky。

$ python my_script.py
于 2013-05-31T09:15:02.783 回答
3
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())

django.setup()
于 2015-07-16T02:05:03.547 回答
2

如果你想在 BG 中跑得更好:

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

输出将在nohup.out

于 2018-05-31T22:30:08.067 回答
1

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

PYTHONSTARTUP=my_script.py python manage.py shell
于 2020-03-02T14:16:51.940 回答
0

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

python manage.py 外壳

要使用这些命令,您必须在虚拟环境中。为此用途:-

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

于 2015-01-22T12:46:47.723 回答
0

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

似乎也不需要。

仅此一项就起作用了。

import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")
于 2014-09-15T20:12:28.510 回答
0

我刚刚发现有趣的是 Django Scripts,它允许您编写脚本以使用 python manage.py runscript foobar 运行。可以在此处找到有关实施和结构的更多详细信息,http: //django-extensions.readthedocs.org/en/latest/index.html

于 2014-06-04T14:09:28.783 回答
0

它执行这个的另一种方式:

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

这适用于 Python2.7 和 Django1.9

于 2019-08-07T21:47:56.027 回答
0

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

./manage.py shell <<EOF
import my_script
my_script.main()
EOF
于 2019-05-08T17:21:41.737 回答
0

晚会迟到了。但这可能对某人有帮助。

您所需要的只是您的脚本并django-extensions已安装。

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

如果您的脚本是scpt.py并且它在一个文件夹fol中,您可以按如下方式运行该脚本。

python manage.py shell_plus

并将您的脚本导入到 shell 中,如下所示。

>>> from fol import scpt
于 2020-05-12T14:34:35.697 回答
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)

于 2020-04-16T14:01:31.050 回答
0

首先检查您的文件。

py manage.py

如果显示您的文件

[contracts]
category_load

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

py manage.py category_load
于 2022-01-27T17:44:00.080 回答