Запуск скрипта Python вне Django - PullRequest
35 голосов
/ 21 августа 2009

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

Редактировать: В настоящее время я могу запустить его, перейдя по URL-адресу ...

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

Ответы [ 6 ]

40 голосов
/ 21 августа 2009

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

20 голосов
/ 21 августа 2009
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
13 голосов
/ 21 августа 2009

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

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

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

10 голосов
/ 01 августа 2013

Использование runscript из django-extensions : python manage.py runscript <my_script>

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

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

    touch scripts/__init__.py

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

    #hello.py
    
    def hello():
        return "Hello, World"
    
    def run():
        print hello()
    
  5. Запустить скрипт с python manage.py runscript hello

Подробнее см. В документах и в блоге .

10 голосов
/ 26 августа 2012

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

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

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

1 голос
/ 17 августа 2015

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

myproject/management/commands/run-script.py * * 1004

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...