Как запустить произвольный код при запуске оболочки django?
Этот вопрос: У автоматического импорта моделей при запуске оболочки Django есть ответы, объясняющие, как импортировать модели при запуске с использованием shell_plus, но нет ответа о том, как вообще запускать код.
Но есть ли простой способ запустить скрипт на Python?
python manage.py shell [or shell_plus] --run=script.py
Запустил бы скрипт так, как если бы вы запустили все это сразу после запуска оболочки.
Я понимаю, что вы можете импортировать вещи в оболочку, но тогда они застряли в пространстве имен.
Я думаю, у ipython должен быть способ запустить скрипт, а затем импортировать его locals()
в пространство имен верхнего уровня. В этом случае вы могли бы просто сделать %magic script.py
и мы были бы до одного шага, что было бы хорошо.
Смена способа запуска оболочки должна быть в порядке - главная цель - просто создать файл, который запускается при запуске оболочки.
5 ответов
Не уверен, есть ли флаг, который вы можете использовать, но если у вас установлен ipython, он должен быть таким простым:
ipython
Тогда, когда вы в приглашении:
run script.py
Затем:
run manage.py shell
Вы можете создать свою собственную команду так же, как shell_plus
сделал: см. источник shell_plus
Команда, чтобы увидеть, как. В этом коде вы можете указать и запустить файл, который необходимо выполнить перед запуском оболочки. Также полезна документация Django по созданию пользовательских команд.
Вы можете попробовать использовать переменную окружения PYTHONSTARTUP. Также попробуйте django-extensions: django-extensions
Смотрите команду django-extensions/management/commands/shell_plus.py.
Из исходного кода этой команды я вижу, что она уважает переменную env PYTHONSTARTUP.
shell_plus использует ограниченную форму IPython, которая не обрабатывает его запуск и настройку, что побеждает большинство обычных попыток запуска при запуске оболочки django+ipython. Вы можете переключить его, чтобы использовать полную версию, которая решит большинство проблем.
Модифицируйте django_extensions/management/commands/shell_plus.py
Удалить:
embed(user_ns=imported_objects)
и заменить его на:
from IPython import start_ipython
start_ipython(argv=[], user_ns=imported_objects)
Тогда ваш код Python в каталогах автозагрузки будет загружен.
Кажется, что самый простой способ - это запуститьcat myscript.py | awx-manage shell
Для справки см. https://github.com/ansible/awx-operator/blob/7d2d1b3c5e3766966bfec0f9f58037f654b93b59/roles/installer/tasks/initialize_django.yml#L21-L24 .