Можно ли войти в ipython из кода?
для моих нужд отладки, pdb
- Это очень хорошо. Однако, это было бы много кулер (и полезно) если бы я мог вернуться в ipython
. Возможно ли это?
12 ответов:
есть
ipdb
проект, который встраивает iPython в стандартный pdb, так что вы можете просто сделать:import ipdb; ipdb.set_trace()
он устанавливается через обычный
pip install ipdb
.
ipdb
довольно короткий, поэтому вместо easy_installing вы также можете создать файлipdb.py
где-то на вашем пути Python и вставьте в этот файл следующий код:import sys from IPython.Debugger import Pdb from IPython.Shell import IPShell from IPython import ipapi shell = IPShell(argv=['']) def set_trace(): ip = ipapi.get() def_colors = ip.options.colors Pdb(def_colors).set_trace(sys._getframe().f_back)
в IPython 0.11, вы можете встроить IPython непосредственно в ваш код, как это
ваша программа может выглядеть так
In [5]: cat > tmpf.py a = 1 from IPython import embed embed() # drop into an IPython session. # Any variables you define or modify here # will not affect program execution c = 2 ^D
это то, что происходит, когда вы запускаете его (я произвольно решил запустить его внутри существующего сеанса ipython. Вложенность сеансов ipython, подобных этому, по моему опыту, может привести к сбою).
In [6]: In [6]: run tmpf.py Python 2.7.2 (default, Aug 25 2011, 00:06:33) Type "copyright", "credits" or "license" for more information. IPython 0.11 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. In [1]: who a embed In [2]: a Out[2]: 1 In [3]: Do you really want to exit ([y]/n)? y In [7]: who a c embed
в эквиваленте
import pdb; pdb.set_trace()
С IPython-это что-то вроде:
from IPython.ipapi import make_session; make_session() from IPython.Debugger import Pdb; Pdb().set_trace()
Это немного многословно, но хорошо знать, если у вас не установлен ipdb. Элемент
make_session
вызов требуется один раз, чтобы настроить цветовую схему и т. д., иset_trace
вызовы могут быть размещены в любом месте вам нужно сломать.
Если вы используете более современную версию IPython (> 0.10.2), вы можете использовать что-то вроде
from IPython.core.debugger import Pdb Pdb().set_trace()
но, вероятно, лучше просто использовать ipdb
обычно, когда я использую ipython, я включаю автоматическую отладку с помощью команды "pdb" внутри нее.
затем я запускаю свой скрипт с помощью "run myscript.py" команда в директории, где находится мой скрипт.
Если я получаю исключение, ipython останавливает программу внутри отладчика. Проверьте команду справки для команд magic ipython (%magic)
мне нравится просто вставлять этот однострочный в мои скрипты, где я хочу установить точку останова:
__import__('IPython').Debugger.Pdb(color_scheme='Linux').set_trace()
новая версия может использовать:
__import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace()
похоже, что модули были перетасованы вокруг немного недавно. На IPython 0.13.1 для меня работает следующее
from IPython.core.debugger import Tracer; breakpoint = Tracer() breakpoint() # <= wherever you want to set the breakpoint
хотя, увы, это все довольно бесполезно в qtconsole.
новые версии IPython обеспечивают простой механизм для встраивания и вложенности сеансов IPython в любые программы Python. Вы можете следовать следующий рецепт для внедрения сеансов IPython:
try: get_ipython except NameError: banner=exit_msg='' else: banner = '*** Nested interpreter ***' exit_msg = '*** Back in main IPython ***' # First import the embed function from IPython.frontend.terminal.embed import InteractiveShellEmbed # Now create the IPython shell instance. Put ipshell() anywhere in your code # where you want it to open. ipshell = InteractiveShellEmbed(banner1=banner, exit_msg=exit_msg)
затем использовать
ipshell()
всякий раз, когда вы хотите, чтобы упасть в оболочку IPython. Это позволит вам встроить (и даже вложить) интерпретаторы IPython в ваш код.
С IPython docs:
import IPython.ipapi namespace = dict( kissa = 15, koira = 16) IPython.ipapi.launch_new_instance(namespace)
запускает оболочку IPython программно. Очевидно, что значения
namespace
dict - это просто фиктивные значения - это может иметь больше смысла использоватьlocals()
на практике.обратите внимание, что вы должны жестко это, это не будет работать так, как
pdb
делает. Если это то, что вы хотите, ответ Доксалогоса, вероятно, больше похож на то, что вы ищете.
быстрый и простой способ:
from IPython.Debugger import Tracer debug = Tracer()
тогда просто напишите
debug()
везде, где вы хотите начать отладку вашей программы.
мне пришлось гуглить это пару раз за последние несколько дней, чтобы добавить ответ... иногда приятно иметь возможность нормально запускать скрипт и только заходить в ipython / ipdb на ошибки, не ставя
ipdb.set_trace()
точки останова в кодеipython --pdb -c "%run path/to/my/script.py --with-args here"
("первый"!--2--> и
pip install ipdb
конечно)
Это довольно просто:
ipython some_script.py --pdb
Он нуждается в установке iPython, обычно это работает:
pip install ipython
Я использую ipython3 вместо ipython, поэтому я знаю, что это последняя версия Python.
это легко запомнить, потому что вы просто используете iPython вместо python и добавляете --pdb в конец.