Мне нужно выполнить скрипт Python из оболочки Django. Я старался:
./manage.py shell << my_script.py
Но это не сработало. Просто ждал, что я что-нибудь напишу.
Мне нужно выполнить скрипт Python из оболочки Django. Я старался:
./manage.py shell << my_script.py
Но это не сработало. Просто ждал, что я что-нибудь напишу.
Часть <<
неверна, вместо этого используйте <
:
$ ./manage.py shell < myscript.py
Вы также можете сделать:
$ ./manage.py shell
...
>>> execfile('myscript.py')
Для python3 вам нужно будет использовать
>>> exec(open('myscript.py').read())
Вам не рекомендуется делать это из shell
- и это задумано, поскольку вам не следует выполнять случайные сценарии из среды django (но есть способы обойти это, см. другие ответы).
Если это сценарий, который вы будете запускать несколько раз, рекомендуется установить его как пользовательскую команду, т.е.
$ ./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(self, **options):
# now do the things that you want with your models here
Для тех, кто использует Django 1.7+, кажется, что просто импортировать модуль настроек недостаточно.
После некоторого копания я нашел ответ "Переполнение стека": fooobar.com/questions/44106/...
Теперь вам нужно:
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)
Я опаздываю на вечеринку, но надеюсь, что мой ответ поможет кому-то: Вы можете сделать это в своем Python script:
import sys, os
sys.path.append('/path/to/your/django/app')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.conf import settings
остальная часть вашего материала идет здесь....
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.
Если IPython доступен (pip install ipython
), тогда ./manage.py shell
автоматически использует ее, а затем вы можете использовать волшебную команду %run
:
%run my_script.py
Вы можете просто запустить script с помощью переменной окружения DJANGO_SETTINGS_MODULE
. Это все, что требуется для настройки среды Django-оболочки.
Это работает в Django >= 1.4
@AtulVarma предоставил очень полезный комментарий в соответствии с неработающим принятым ответом:
echo 'import myscript' | python manage.py shell
Как указывают другие ответы, но не указывают явно, что вам на самом деле может потребоваться не обязательно выполнение скрипта из оболочки Django, а доступ к вашим приложениям без использования оболочки Django.
Это сильно отличается от версии Django к версии Django. Если вы не нашли свое решение в этой теме, ответьте здесь - сценарий Django для доступа к объектам модели без использования оболочки manage.py - или подобные поиски могут вам помочь.
Я должен был начать my_command.py с
import os,sys
sys.path.append('/path/to/myproject')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.file")
import django
django.setup()
import project.app.models
#do things with my models, yay
а затем запустил python3 my_command.py
(Джанго 2.0.2)
import os, sys, django
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"
sys.path.insert(0, os.getcwd())
django.setup()
если в вашем скрипте не так много команд, используйте его:
manage.py shell --command="import django; print(django.__version__)"
Обратите внимание: этот метод устарел для более поздних версий 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
Попробуйте, если вы используете виртуальную среду: -
оболочка python manage.py
для использования этой команды вы должны находиться внутри виртуальной среды. для этого использования: -
workon vir_env_name
например: -
[email protected]:~/mysite$ workon jango
(jango)[email protected]:~/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 - мое виртуальное имя среды
Если вы хотите, чтобы работать в BG еще лучше:
nohup echo 'exec(open("my_script.py").read())' | python manage.py shell &
Вывод будет в nohup.out
Что-то, что мне показалось интересным, это Django Scripts, который позволяет писать сценарии для запуска с помощью python manage.py. Более подробную информацию о реализации и структуре можно найти здесь, http://django-extensions.readthedocs.org/en/latest/index.html
пришел сюда с тем же вопросом, что и OP, и я нашел свой любимый ответ именно в ошибке в вопросе, которая работает также в Python 3:
./manage.py shell <<EOF
import my_script
my_script.main()
EOF
Другой способ выполнить это:
echo 'execfile("/path_to/myscript.py")' | python manage.py shell --settings=config.base
Это работает на Python2.7 и Django1.9
django.setup(), похоже, не работает.
также не требуется.
это само по себе работало.
import os, django, glob, sys, shelve
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myProject.settings")