在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>

为了做到这一点,你需要:

  1. pip install django-extensions
  2. 创build一个名为scripts的目录。 这可以位于您的根目录或特定的应用程序中。
  3. 使用空白的init文件初始化该目录:

    touch scripts/__init__.py

  4. 将脚本放在这个目录下,并包含一个run()函数。 例:

     #hello.py def hello(): return "Hello, World" def run(): print hello() 
  5. 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