Запуск Python script за пределами Django

У меня есть script, который использует функции Django ORM среди других внешних библиотек, которые я хочу запустить за пределами Django (т.е. выполняется из командной строки).

Изменить: На данный момент я могу запустить его, перейдя по URL-адресу...

Как настроить среду для этого?

Ответ 1

Самый простой способ сделать это - настроить script как подкоманду 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 ...

Поместите это в файл в любом из ваших приложений под управлением /commands/yourcommand.py(с пустыми __init__.py файлами в каждом), и теперь вы можете вызвать ваш script с помощью ./manage.py yourcommand.

Ответ 2

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

Ответ 3

Все, что вам нужно, это импортируемые настройки и правильная настройка пути python. В наиболее сырой форме это можно сделать, установив соответствующие переменные среды, например:

$ DJANGO_SETTINGS_MODULE=myproject.settings PYTHONPATH=$HOME/djangoprojects python myscript.py

Существуют и другие способы, такие как вызов settings.configure() и уже упомянутый setup_environ(), описанный Джеймсом Беннеттом в в блоге.

Ответ 4

Примечание, что предложения об импорте настроек и использовании setup_environ устарели с помощью Django 1.4.

В Django Github есть поток, описывающий почему это было сделано.

Есть еще некоторые варианты, но многие из них кажутся мне хаки. Мой предпочтительный метод часто включает в себя скриптовую функцию как расширенную команду manage.py

Ответ 5

Используйте runscript из django-extensions: python manage.py runscript <my_script>

Для этого вам необходимо:

  • pip install django-extensions
  • Создайте каталог с именем scripts. Это может быть расположено в корневом каталоге или в определенном приложении.
  • Инициализировать каталог пустым файлом инициализации:

    touch scripts/__init__.py

  • Поместите свой script в этот каталог и включите функцию run(). Пример:

    #hello.py
    
    def hello():
        return "Hello, World"
    
    def run():
        print hello()
    
  • Запустите script с помощью python manage.py runscript hello

Подробнее см. docs и полезный пост в блоге.

Ответ 6

Мне нравится добавлять следующую команду в мои проекты:

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