Как выполнить скрипт Python из оболочки Django?

130

Мне нужно выполнить Python script из оболочки Django. Я попробовал

./manage.py shell << my_script.py

Но это не сработало. Это было просто любопытное ожидание, когда я что-то напишу.

  • 0
    Это не то, как работает django , что вы на самом деле хотите сделать?
  • 2
    my_script.py содержит несколько операций над одной из моих моделей Django. Я уже делал это раньше, но не могу вспомнить, как именно.
Теги:

13 ответов

235
Лучший ответ

Часть << неверна, вместо этого используйте <:

$ ./manage.py shell < myscript.py

Вы также можете сделать:

$ ./manage.py shell
...
>>> execfile('myscript.py')

Для python3 вам нужно будет использовать

>>> exec(open('myscript.py').read())
  • 12
    Для меня это выполняет только первую строку скрипта. Единственное, что работает, - это объединение обоих методов: ./manage.py shell <<EOF\ execfile('myscript.py') \EOF
  • 0
    Это больше не работает с Python 3+. Любая идея заменить это?
Показать ещё 7 комментариев
133

Вам не рекомендуется делать это с помощью shell - и это предназначено, поскольку вы не должны выполнять случайные скрипты из среды django (но есть способы обойти это, см. другие ответы).

Если это script, который вы будете запускать несколько раз, рекомендуется создать его как пользовательскую команду, т.е.

 $ ./manage.py my_command

для этого создайте файл в поддирете management и commands вашего app, то есть

my_app/
    __init__.py
    models.py
    management/
        __init__.py
        commands/
            __init__.py
            my_command.py
    tests.py
    views.py

и в этом файле определите свою пользовательскую команду (убедитесь, что имя файла - это имя команды, которую вы хотите выполнить из ./manage.py)

from django.core.management.base import BaseCommand

class Command(BaseCommand):
    def handle_noargs(self, **options):
        # now do the things that you want with your models here
  • 6
    Опять же, это лучший ответ. Начиная с django 1.8, NoArgsCommand устарела. На этой странице приведен рабочий пример: docs.djangoproject.com/en/1.9/howto/custom-management-commands/…
  • 1
    Согласно предыдущему комментарию, чтобы это работало для меня, мне нужно было изменить def handle_noargs(self, **options): def handle(self, **options):
Показать ещё 2 комментария
67

Для тех, кто использует Django 1.7+, кажется, что просто импортировать модуль настроек недостаточно.

После некоторого копания я нашел ответ "Переполнение стека": https://stackoverflow.com/questions/22744949/runtime-errorapp-registry-isnt-ready-yet

Теперь вам нужно:

import os, django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")
django.setup()
# now your code can go here...

Без выполнения вышеизложенного я получил ошибку django.core.exceptions.AppRegistryNoReady.

Мой script файл находится в том же каталоге, что и мой проект django (т.е. в той же папке, что и manage.py)

  • 2
    В моей настройке уже есть файл настроек, DJANGO_SETTINGS_MODULE переменной среды DJANGO_SETTINGS_MODULE . С этим было достаточно просто: import django ; django.setup() до 1.7.
  • 1
    С django 1.7+ это должен быть принятый ответ :)
Показать ещё 4 комментария
65

Я опаздываю на вечеринку, но надеюсь, что мой ответ поможет кому-то: Вы можете сделать это в своем Python script:

import sys, os
sys.path.append('/path/to/your/django/app')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings

остальная часть вашего материала идет здесь....

  • 3
    Также обратите внимание , что вы можете отказаться от sys.path.append вещи до тех пор , как вы получите DJANGO_SETTINGS_MODULES право (например , если у вас есть сценарий , сидя чуть выше корневой сайт вы можете сделать os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings' ).
  • 0
    В итоге я сделал sys.path.append(os.getcwd()) , он работает, когда я нахожусь в каталоге моего проекта, мой DJANGO_SETTINGS_MODULE правильный, и я пытаюсь запустить скрипт, который импортирует модели, виды и т. Д.
Показать ещё 2 комментария
14

runscript из django-extensions

python manage.py runscript scripty.py

Образец script.py для проверки:

from django.contrib.auth.models import User
print(User.objects.values())

Упоминается по адресу http://django-extensions.readthedocs.io/en/latest/command_extensions.html и задокументировано по адресу:

python manage.py runscript --help

Существует также учебник.

Протестировано на Django 1.9.6, django-extensions 1.6.7.

  • 1
    Это лучший ответ, если вы уже используете django-extensions (вам следует). Примечание. Похоже, что в runscript используется стандартная shell django. Было бы замечательно, если бы он использовал shell_plus (также в расширениях), чтобы вам не пришлось импортировать все для простых скриптов.
7

Вы можете просто запустить script с помощью переменной окружения DJANGO_SETTINGS_MODULE. Это все, что требуется для настройки среды Django-оболочки.

Это работает в Django >= 1.4

4

Если IPython доступен (pip install ipython), тогда ./manage.py shell будет автоматически использовать оболочку, а затем вы можете использовать магию команда %run:

%run my_script.py
3

Обратите внимание: этот метод устарел для более поздних версий django! ( > 1,3)

Альтернативный ответ, вы можете добавить это в начало my_script.py

from django.core.management import setup_environ
import settings
setup_environ(settings)

и выполните my_script.py только с python в каталоге, где у вас есть settings.py, но это немного взломано.

$ python my_script.py
2

@AtulVarma предоставил очень полезный комментарий в соответствии с неработающим принятым ответом:

echo 'import myscript' | python manage.py shell
  • 0
    отличный ответ! Я пропустил это в комментариях. Спасибо, что выложили это здесь
2
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())

django.setup()
  • 1
    Не могли бы вы отредактировать объяснение, почему этот код отвечает на вопрос таким образом, который отличается от некоторых из очень похожих предыдущих ответов? Ответы только на код не приветствуются , потому что они не учат решению.
1

Попробуйте, если вы используете виртуальную среду: -

оболочка python manage.py

для использования этой команды вы должны находиться внутри виртуальной среды. для этого использования: -

workon vir_env_name

например: -

dc@dc-comp-4:~/mysite$ workon jango
(jango)dc@dc-comp-4:~/mysite$ python manage.py shell
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

Примечание: - Здесь mysite - это мое имя веб-сайта, а jango - мое виртуальное имя среды

0

Что-то, что мне показалось интересным, это Django Scripts, который позволяет писать сценарии для запуска с помощью python manage.py. Более подробную информацию о реализации и структуре можно найти здесь, http://django-extensions.readthedocs.org/en/latest/index.html

-3

django.setup(), похоже, не работает.

также не требуется.

это само по себе работало.

import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")
  • 1
    django.setup (), безусловно, необходим для начальной загрузки среды Django.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню