Мне нужно выполнить Python script из оболочки Django. Я попробовал
./manage.py shell << my_script.py
Но это не сработало. Это было просто любопытное ожидание, когда я что-то напишу.
Часть <<
неверна, вместо этого используйте <
:
$ ./manage.py shell < myscript.py
Вы также можете сделать:
$ ./manage.py shell
...
>>> execfile('myscript.py')
Для python3 вам нужно будет использовать
>>> exec(open('myscript.py').read())
./manage.py shell <<EOF\ execfile('myscript.py') \EOF
Вам не рекомендуется делать это с помощью 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
NoArgsCommand
устарела. На этой странице приведен рабочий пример: docs.djangoproject.com/en/1.9/howto/custom-management-commands/…
def handle_noargs(self, **options):
def handle(self, **options):
Для тех, кто использует 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)
DJANGO_SETTINGS_MODULE
переменной среды DJANGO_SETTINGS_MODULE
. С этим было достаточно просто: import django ; django.setup()
до 1.7.
Я опаздываю на вечеринку, но надеюсь, что мой ответ поможет кому-то: Вы можете сделать это в своем Python script:
import sys, os
sys.path.append('/path/to/your/django/app')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings
остальная часть вашего материала идет здесь....
sys.path.append
вещи до тех пор , как вы получите DJANGO_SETTINGS_MODULES
право (например , если у вас есть сценарий , сидя чуть выше корневой сайт вы можете сделать os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
).
sys.path.append(os.getcwd())
, он работает, когда я нахожусь в каталоге моего проекта, мой DJANGO_SETTINGS_MODULE правильный, и я пытаюсь запустить скрипт, который импортирует модели, виды и т. Д.
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.
django-extensions
(вам следует). Примечание. Похоже, что в runscript
используется стандартная shell
django. Было бы замечательно, если бы он использовал shell_plus
(также в расширениях), чтобы вам не пришлось импортировать все для простых скриптов.
Вы можете просто запустить script с помощью переменной окружения DJANGO_SETTINGS_MODULE
. Это все, что требуется для настройки среды Django-оболочки.
Это работает в Django >= 1.4
Обратите внимание: этот метод устарел для более поздних версий 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
@AtulVarma предоставил очень полезный комментарий в соответствии с неработающим принятым ответом:
echo 'import myscript' | python manage.py shell
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())
django.setup()
Попробуйте, если вы используете виртуальную среду: -
оболочка 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 - мое виртуальное имя среды
Что-то, что мне показалось интересным, это Django Scripts, который позволяет писать сценарии для запуска с помощью python manage.py. Более подробную информацию о реализации и структуре можно найти здесь, http://django-extensions.readthedocs.org/en/latest/index.html
django.setup(), похоже, не работает.
также не требуется.
это само по себе работало.
import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")
django
, что вы на самом деле хотите сделать?my_script.py
содержит несколько операций над одной из моих моделей Django. Я уже делал это раньше, но не могу вспомнить, как именно.