我有一个脚本,它使用Django ORM功能,以及其他外部库,我想在Django之外运行(即,从命令行执行)。
编辑:目前,我可以通过导航到网址启动它...
如何为此设置环境?
答案 0 :(得分:40)
最简单的方法是将脚本设置为manage.py
子命令。这很容易做到:
from django.core.management.base import NoArgsCommand, make_option
class Command(NoArgsCommand):
help = "Whatever you want to print here"
option_list = NoArgsCommand.option_list + (
make_option('--verbose', action='store_true'),
)
def handle_noargs(self, **options):
... call your script here ...
将它放在一个文件中,位于management / commands / yourcommand.py下的任何应用程序中(每个文件中都包含空__init__.py
个文件),现在您可以使用./manage.py yourcommand
调用脚本。
答案 1 :(得分:20)
from <Project path> import settings #your project settings file
from django.core.management import setup_environ #environment setup function
setup_environ(settings)
#Rest of your django imports and code go here
答案 2 :(得分:13)
您只需要可导入的设置并正确设置python路径。在最原始的形式中,这可以通过设置适当的环境变量来完成,例如:
$ DJANGO_SETTINGS_MODULE=myproject.settings PYTHONPATH=$HOME/djangoprojects python myscript.py
还有其他方法,例如在some blog post中调用settings.configure()
和James Bennett所描述的setup_environ()
。
答案 3 :(得分:10)
注意关于导入设置和使用setup_environ的建议已弃用Django 1.4。
Django Github上有一个描述why this was done的帖子。
还有其他一些选择,但其中许多似乎对我很苛刻。我首选的方法通常是将脚本函数包含为extended command of manage.py
答案 4 :(得分:10)
使用django-extensions中的runscript
:python manage.py runscript <my_script>
为此,您需要:
pip install django-extensions
scripts
的目录。它可以位于根目录或特定应用程序中。 使用空白的init文件初始化目录:
touch scripts/__init__.py
将脚本放在此目录中,并包含run()
函数。例如:
#hello.py
def hello():
return "Hello, World"
def run():
print hello()
使用python manage.py runscript hello
有关详细信息,请参阅docs和helpful blog post。
答案 5 :(得分:1)
我想将以下命令添加到我的项目中:
<pre contentEditable="true">
some text, it's editable
text <label contentEditable="false">it's not!!! test</label>
some text
</pre>
:
myproject/management/commands/run-script.py
然后,我可以运行自定义脚本,例如:
from django.core.management.base import BaseCommand, CommandError
import imp
import sys
class Command(BaseCommand):
help = """Run a non-django script with django settings."""
args = "<path_to_script.py> [<script_args>...]"
def handle(self, *args, **options):
if len(args) == 0:
raise CommandError("Path to script to run is required")
sys.argv = list(args)
imp.load_source("__main__", args[0])
答案 6 :(得分:0)
一个简单的方法:
$ python manage.py shell -c 'import runpy; runpy.run_path("scripts/script_to_run.py")'
其中 scripts/script_to_run.py 是需要运行的脚本!
您可以创建一个名为“runscript.py”的 bash 脚本:
#!/bin/bash
python manage.py shell -c 'import runpy; runpy.run_path("'$1'")'
然后运行:
$ runscript.py scripts/script_to_run.py