Запуск 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