IPython Поддерживать пространство имен после запуска
Я пытался повсюду искать простой способ восстановить функциональность, подобную MATLAB: когда я запускаю script, я хочу, чтобы ipython поддерживал пространство имен моих функций.
У меня есть основная функция, а затем у меня есть функция sim_loop()
, у которой есть код, который я пытаюсь отлаживать. sim_loop()
имеет большой массив, который я хочу отображать после запуска script. Я не могу заставить эту функциональность работать (я предполагаю, что это "интерактивное пространство имен" ).
У меня есть pdb
, но если я выйду из pdb
и хочу проверить переменную, я должен снова запустить все это (не говоря уже о том, что нет автозаполнения и других функций). Я включил оболочку IPython в свой script, но, опять же, это не касается моей проблемы, потому что я хочу многократно выполнять script снова и снова и постоянно проверять переменную внутри моей второй функции (не main()
).
Чтобы уточнить
Я хочу иметь доступ к области подпрограммы моего script после запуска script из ipython.
то есть: я запускаю ipython. Затем я набираю "run script.py". Он работает и работает отлично. Я хочу иметь возможность затем проверить переменную "dummy", которая была в пределах области: main- > sim_loop- > dummy
Я хочу проверить его, а затем снова запустить script с помощью "run script.py", а затем снова проверить "dummy" ad nauseum.
Ответы
Ответ 1
Чтобы запустить script в основном пространстве имен ipython:
ipython script.py
Конечно, это просто работает и выходит. Если вы хотите запустить script в основном пространстве имен ipython, а затем перейдите в REPL:
ipython -i script.py
Если вы уже используете ipython и хотите запустить script в существующем основном пространстве имен ipython:
%run -i script.py
Вам может потребоваться добавить другие параметры, например, если ваш script явно вызывает sys.exit
в любом месте, вам, вероятно, нужен параметр -e
.
Если вы просто хотите импортировать все имена в пространство имен без запуска "активного" кода, вы можете сделать %run -n -i script.py
, если script выполняет тест if __name__ == '__main__'
.
Конечно, даже без ipython вы можете execfile('script.py')
с почти точно таким же эффектом, который вы ищете (за исключением некоторых странных взаимодействий с местными жителями и не работающих в 3.x). Или даже from script import *
может быть достаточно близко.
Ответ 2
То, что вы, по-видимому, хотите, - это разбить область действия для целей dev, сделав locals на глобальные переменные, что может и не быть лучшей идеей.
Как альтернатива, вы знаете о ipdb?