Для моих нужд отладки pdb
это очень хорошо. Однако было бы намного круче (и полезно), если бы я мог углубиться в ipython
. Возможно ли это?
Ответы:
Существует 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)
ModuleNotFoundError: No module named 'IPython.Debugger'
, ModuleNotFoundError: No module named 'IPython.Shell'
иImportError: cannot import name 'ipapi'
ModuleNotFoundError: No module named 'IPython.Debugger'
, ModuleNotFoundError: No module named 'IPython.Shell'
иImportError: cannot import name 'ipapi'
breakpoint()
функцию попасть в ipdb.
В 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
def f() : pass ; IPython.embed = f
чтобы embed()
вызов был беззвучным, тогда Ctrl + D
Эквивалент
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, я включаю автоматическую отладку с помощью команды «pdb» внутри него.
Затем я запускаю свой сценарий с помощью команды «запустить myscript.py» в каталоге, в котором находится мой сценарий.
Если я получаю исключение, ipython останавливает программу внутри отладчика. Ознакомьтесь с командой справки по волшебным командам 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 :
import IPython.ipapi
namespace = dict(
kissa = 15,
koira = 16)
IPython.ipapi.launch_new_instance(namespace)
программно запустит оболочку IPython. Очевидно, что значения в namespace
dict - это просто фиктивные значения - это может иметь больше смысла для практического использования locals()
.
Обратите внимание, что вам нужно жестко запрограммировать это в; это не будет работать так, как pdb
работает. Если это то, что вам нужно, ответ DoxaLogos, вероятно, больше похож на то, что вы ищете.
Быстрый и легкий способ:
from IPython.Debugger import Tracer
debug = Tracer()
Тогда просто напишите
debug()
везде, где вы хотите начать отладку своей программы.
ImportError: No module named 'IPython.Debugger'
на python 3.4 / IPython 3
Мне приходилось гуглить это пару раз в последние несколько дней, поэтому добавляю ответ ... иногда приятно иметь возможность нормально запускать скрипт и переходить в ipython / ipdb только при ошибках, без необходимости вставлять ipdb.set_trace()
точки останова в код
ipython --pdb -c "%run path/to/my/script.py --with-args here"
(сначала pip install ipython
и pip install ipdb
конечно)
ipython --pdb -- ./path/to/my/script --with-args here
Это довольно просто:
ipython some_script.py --pdb
Требуется установка iPython, обычно это работает:
pip install ipython
Я использую ipython3 вместо ipython, поэтому знаю, что это последняя версия Python.
Это легко запомнить, потому что вы просто используете iPython вместо python и добавляете --pdb в конец.
Чтобы получить REPL IPython с использованием цветов терминала, мне пришлось сделать следующее:
from IPython import start_ipython
start_ipython()
https://ipython.readthedocs.io/en/stable/api/generated/IPython.html#IPython.start_ipython