在Django之外运行Python脚本

时间:2009-08-21 07:33:38

标签: python django

我有一个脚本,它使用Django ORM功能,以及其他外部库,我想在Django之外运行(即,从命令行执行)。

编辑:目前,我可以通过导航到网址启动它...

如何为此设置环境?

7 个答案:

答案 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中的runscriptpython manage.py runscript <my_script>

为此,您需要:

  1. pip install django-extensions
  2. 创建名为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

  6. 运行脚本

    有关详细信息,请参阅docshelpful 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