使用 django:从“python manage.py shell”到 python 脚本

Posted

技术标签:

【中文标题】使用 django:从“python manage.py shell”到 python 脚本【英文标题】:use django: from "python manage.py shell" to python script 【发布时间】:2011-06-18 08:41:40 【问题描述】:

我可以移动到 python 项目目录(比如 c:\www\myproject)然后发出

   python manage.py shell

然后我可以使用 django 项目中的所有模块,从 shell 命令中说出以下命令:

import settings 
from django.template import Template, Context

t=Template("My name is myname.")
c=Context("myname":"John")
f = open('write_test.txt', 'w')
f.write(t.render(c))
f.close

现在,当我尝试将所有命令收集到 python 脚本中时,例如“mytest.py”,我无法执行该脚本。我一定错过了一些重要的事情。

我发布了python mytest.py

然后我得到Import error: could not import settings 它在系统路径上吗?”

我在settings.py所在的项目目录中.....

有人能帮帮我吗?

谢谢。

【问题讨论】:

你能发布错误吗?您很可能遇到了 PYTHONPATH 问题。由于您的问题提到了 C: 驱动器,我假设您在 Windows 上。 docs.python.org/using/windows.html Django script to access model objects without using manage.py shell的可能重复 【参考方案1】:

尝试改用Django management command。

# myproject/myapp/management/commands/my_command.py

from django.core.management.base import NoArgsCommand
from django.template import Template, Context
from django.conf import settings

class Command(NoArgsCommand):
    def handle_noargs(self, **options):
        t=Template("My name is myname.")
        c=Context("myname":"John")
        f = open('write_test.txt', 'w')
        f.write(t.render(c))
        f.close

然后(如果您遵循文档)您将能够以以下方式执行命令:

python manage.py my_command

【讨论】:

查看我的其他答案,这可能只是解决问题。但是,如果您想为您的脚本提供一个整洁的地方,那么管理命令可能是您的最佳选择。【参考方案2】:

这个方法是 Django 1.4 中的deprecated。请改用django.conf.settings.configure() (请参阅@adiew 的答案以获取示例代码)。

遵循旧方法。

把它放在脚本的开头

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

这确实是 manage.py 在幕后所做的。要查看它,请查看django/core/management/__init__.py 中的 Django 源代码。执行这些行后,一切都应该就像./manage.py shell 中的一样。

【讨论】:

这已在 Django 1.4 中被贬低。改用@adieu from django.conf import settings;settings.configure() 对我来说,这仍然是正确的答案(对于我来说,从 Django 1.5 开始)。 settings.configure() 有时还不够【参考方案3】:

尝试将这两行放在脚本的开头:

from django.conf import settings
settings.configure() # check django source for more detail

# now you can import other django modules
from django.template import Template, Context

【讨论】:

【参考方案4】:

更新:来自another post。

./manage.py shell < myscript.py

【讨论】:

【参考方案5】:

要导入 Django 的设置,请使用:

from django.conf import settings

【讨论】:

我把“from django.conf import settings”作为我脚本的第一行,但 python 仍然无法导入设置.....我是否以正确的方式使用它?谢谢! 我使用管理命令的原因是因为 Django 在启动时会在 Python 路径上放置一堆东西(例如django),而使用管理命令可以利用这一点。 python manage.py shell 启动常规版本的 python 中断器,但添加了环境。例如,尝试在常规 python 中断器而不是 django shell 中执行您的语句。【参考方案6】:

无需手动将内容添加到您的 python 脚本,或者必须适应管理命令格式,以防这不是需要长时间保留的内容,您可以通过运行脚本来获得 Django 环境的所有好处./manage.py runscript <myscript.py>

...但是如果您的脚本在您的项目文件夹中,那么您只需将这一行添加到 python 脚本的顶部:import os; os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

【讨论】:

使用runscript有点复杂,不过总结的很好here【参考方案7】:

在 https://***.com/a/24456404/4200284 中看到了 Django >= 1.7 的一个很好的解决方案,如果有人使用 django-configurations 这对我有用:

import sys, os, django

sys.path.append('/path/to/project')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.local") # path to config

## if using django-configurations
os.environ.setdefault("DJANGO_CONFIGURATION", "Local")
from configurations import importer
importer.install()

django.setup() ## apparently important for django 1.7

from foo.models import Bar

print Bar.objects.all()

【讨论】:

【参考方案8】:

这是另一个变体:我编写并经常使用管理命令“运行”,它的优点是脚本可以看到它们的命令行参数:

http://lino-framework.org/api/lino.management.commands.run.html

【讨论】:

以上是关于使用 django:从“python manage.py shell”到 python 脚本的主要内容,如果未能解决你的问题,请参考以下文章

初试django---python manage.py makemigrations以及python manage.py migrate

Django 中 python manage.py makemigrations 与 python manage.py migrate

DJango数据库报错 python manage.py syncdb

Django 2.0教程 - 执行python3 manage.py makemigrations时出错

Django学习——python manage.py startapp app-name新建app报错问题

django 和 python ./manage.py makemigrations 执行错误