在Django之外运行一个Python脚本
我有一个使用Django ORMfunction的脚本,以及其他外部库,我想在Django之外运行(即从命令行执行)。
编辑:目前,我可以启动它通过导航到一个URL …
我如何为此设置环境?
最简单的方法是将脚本设置为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 ...
把它放在一个文件中,在pipe理/命令/ yourcommand.py下的任何应用程序中(每个应用程序都有空的__init__.py
文件),现在可以用./manage.py yourcommand
来调用脚本。
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
所有你需要的是可导入的设置,并正确设置pythonpath。 在最原始的forms,这可以通过设置适当的环境variables,如:
$ DJANGO_SETTINGS_MODULE=myproject.settings PYTHONPATH=$HOME/djangoprojects python myscript.py
还有其他方法,比如在某些博客文章中调用James Bennett描述的settings.configure()
和已经提到的setup_environ()
。
请注意 ,关于导入设置和使用setup_environ的build议已被Django 1.4弃用。
Django Github上有一个线程描述了为什么这样做 。
还有一些其他的select,但是其中很多对我来说似乎很难受。 我的首选方法通常是将脚本函数作为manage.py的扩展命令
使用django-extensions中的 python manage.py runscript <my_script>
: python manage.py runscript <my_script>
为了做到这一点,你需要:
-
pip install django-extensions
- 创build一个名为
scripts
的目录。 这可以位于您的根目录或特定的应用程序中。 -
使用空白的init文件初始化该目录:
touch scripts/__init__.py
-
将脚本放在这个目录下,并包含一个
run()
函数。 例:#hello.py def hello(): return "Hello, World" def run(): print hello()
-
用
python manage.py runscript hello
运行脚本
有关更多详细信息,请参阅文档和有用的博客文章 。
我喜欢将下面的命令添加到我的项目中:
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])
然后,我可以运行自定义脚本,例如:
./manage.py run-script /path/to/myscript.py --opt=value arg1 arg2