Ввод интерактивного режима в 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

Будет охватывать многие случаи