Ввод интерактивного режима в Python
Я запускаю свою программу Python и имею точку, в которой было бы полезно перепрыгнуть и посмотреть, что происходит, а затем снова выйти. Похоже на временный режим консоли.
В Matlab я бы использовал команду keyboard
, но я не уверен, что команда находится в python.
Есть ли способ сделать это?
Например:
for thing in set_of_things:
enter_interactive_mode_here()
do_stuff_to(thing)
Когда вызов enter_interactive_mode()
, я хотел бы пойти туда, осмотреться, а затем уйти и продолжить работу программы.
Ответы
Ответ 1
code.interact()
похоже работает как-то:
>>> import code
>>> def foo():
... a = 10
... code.interact(local=locals())
... return a
...
>>> foo()
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> a
10
Ctrl + Z возвращается к "основному" интерпретатору.
Вы можете читать локальные жители, но их изменение не работает таким образом.
Ответ 2
python -i myapp.py
Это выполнит myapp.py
и выведет вас в интерактивную оболочку. Оттуда вы можете выполнять функции и проверять их вывод, загружая всю среду (импорт и т.д.) myapp.py
.
Для чего-то более сложного - было бы лучше использовать отладчик вроде pdb
, установив точку останова. Кроме того, большинство IDE (PyDev, PyCharm, Komodo...) имеют графические отладчики.
Ответ 3
Я использую pdb
для этой цели. Я понимаю, что Эмиль уже упомянул об этом в своем ответе, но он не включил пример или не уточнил, почему он отвечает на ваш вопрос.
for thing in set_of_things:
import pdb; pdb.set_trace()
do_stuff_to(thing)
Вы можете читать и устанавливать переменные, начиная свою команду с восклицательным знаком. Вы также можете перемещать вверх и вниз по стеку (команды u
и d
), которые InteractiveConsole
не имеют встроенных механизмов.
Чтобы программа продолжала выполнение, используйте команду c
. В приведенном выше примере он будет вводить отладчик в каждую итерацию цикла, поэтому вы можете обернуть вызов set_trace()
в предложение if
.
Ответ 4
У вас есть опции - стандартная библиотека Python или IPython.
Стандартная библиотека Python имеет code
модуль, который имеет InteractiveConsole
, целью которого является "Тесное эмулирование поведения интерактивного интерпретатора Python". Это, вероятно, будет способно делать то, что вы хотите, но в документации нет примеров того, как это использовать, и у меня нет никаких предложений о том, куда идти.
IPython, который является более продвинутым терминалом Python, имеет возможность встроить консоль в любой момент в вашей встроенной программе. В соответствии с их документацией вы можете просто сделать
from IPython import embed
for thing in set_of_things:
embed()
do_stuff_to(thing)
Ответ 5
Самый удобный инструмент для меня - ipdb.
ipdb экспортирует функции для доступа к отладчику IPython, который включает в себя завершение вкладки, подсветку синтаксиса, лучшие трассировки, лучшую интроспекцию с тем же интерфейсом, что и модуль pdb.
Завершение и удобная интроспекция особенно полезны для отладки.
Ответ 6
Вы можете использовать ipdb
.
Чтобы установить точки останова, добавьте import ipdb; ipdb.set_trace()
, где вы хотите перейти в отладчик. Когда вы достигнете точки останова, вам будет предоставлена интерактивная оболочка и несколько строк кода вокруг вашей точки останова для контекста.
https://www.safaribooksonline.com/blog/2014/11/18/intro-python-debugger/
Ответ 7
Хотя это, вероятно, не самый подходящий вариант, такой простой, как:
try:
while True:
print input()
except:
pass
Будет охватывать многие случаи