Как запустить произвольный код при запуске оболочки 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 .

Другие вопросы по тегам