如何从Django shell执行Python脚本?

时间:2013-05-31 09:05:37

标签: python django django-shell

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

./manage.py shell << my_script.py

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

21 个答案:

答案 0 :(得分:315)

<<部分错误,请改用<

$ ./manage.py shell < myscript.py

你也可以这样做:

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

对于python3,您需要使用

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

答案 1 :(得分:189)

不建议您从shell执行此操作 - 这是因为您不应该真正从django环境执行随机脚本(但方式这,见其他答案)。

如果这是一个你将多次运行的脚本,最好将其设置为custom command

 $ ./manage.py my_command

这样做会在management的{​​{1}}和commands的子目录中创建一个文件,即

app

并在此文件中定义您的自定义命令(确保文件名是您要从my_app/ __init__.py models.py management/ __init__.py commands/ __init__.py my_command.py tests.py views.py 执行的命令的名称)

./manage.py

答案 2 :(得分:89)

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

答案 3 :(得分:66)

我参加晚会但是我希望我的回复会帮助某人: 您可以在Python脚本中执行此操作:

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

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

答案 4 :(得分:22)

来自django-extensions

runscript

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

There is a tutorial too

在Django 1.9.6上测试,django-extensions 1.6.7。

答案 5 :(得分:9)

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

%run my_script.py

答案 6 :(得分:8)

您可以使用DJANGO_SETTINGS_MODULE环境变量集运行脚本。这就是设置Django-shell环境所需的一切。

这适用于Django&gt; = 1.4

答案 7 :(得分:4)

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

这有很多Django版本与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)

答案 8 :(得分:3)

@AtulVarma在无法工作的accepted answer

下提供了非常有用的评论
echo 'import myscript' | python manage.py shell

答案 9 :(得分:3)

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

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

Django docs

答案 10 :(得分:2)

注意,此方法已被弃用于更新版本的django!(&gt; 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

答案 11 :(得分:1)

如果您使用虚拟环境,请尝试此操作: -

  

python manage.py shell

使用这些命令你必须在虚拟环境中。用于此用途: -

  

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

答案 12 :(得分:1)

如果你想更好地在BG中跑步:

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

输出将在nohup.out

答案 13 :(得分:1)

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

第一步:导入

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 的值

答案 14 :(得分:0)

我刚刚发现有趣的是Django Scripts,它允许你编写脚本来运行python manage.py runscript foobar。有关实施和结构的更多详细信息,请参见http://django-extensions.readthedocs.org/en/latest/index.html

答案 15 :(得分:0)

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

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

答案 16 :(得分:0)

以其他方式执行此操作:

 def recordToType[T, F, A[_, _] <: TBase[T, F]](record: ConsumerRecord[String, Array[Byte]])(
    implicit m: scala.reflect.ClassTag[A[_,_]]
  ): A[T,F] = {
   val a:A[T,F] = m.runtimeClass.getConstructors.head.newInstance().asInstanceOf[A[T, F]]
   ...

这适用于Python2.7和Django1.9

答案 17 :(得分:0)

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

PYTHONSTARTUP=my_script.py python manage.py shell

答案 18 :(得分: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)

答案 19 :(得分:0)

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

您所需要做的就是您的脚本并安装django-extensions

只需运行shell_plus中可用的django_extensions,然后导入您编写的脚本即可。

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

python manage.py shell_plus

,只需按照以下步骤将脚本导入外壳程序即可。

>>> from fol import scpt

答案 20 :(得分:-1)

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

似乎也不需要。

这一点有效。

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