Можно ли зайти в ipython из кода? - PullRequest
78 голосов
/ 14 июля 2009

Для моих потребностей в отладке, pdb довольно хорошо. Тем не менее, было бы намного круче (и полезно), если бы я мог перейти на ipython. Это возможно?

Ответы [ 12 ]

109 голосов
/ 14 июля 2009

Существует проект ipdb, который встраивает iPython в стандартную pdb, так что вы можете просто сделать:

import ipdb; ipdb.set_trace()

Устанавливается через обычный pip install ipdb.

ipdb довольно короткий, поэтому вместо easy_install вы также можете создать файл 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)
53 голосов
/ 14 сентября 2011

В 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
12 голосов
/ 21 сентября 2012

Если вы используете более современную версию IPython (> 0.10.2), вы можете использовать что-то вроде

from IPython.core.debugger import Pdb
Pdb().set_trace()

Но, вероятно, лучше просто использовать ipdb

11 голосов
/ 15 июля 2009

Эквивалент

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 можно выполнять в любом месте, где вам нужно прервать.

8 голосов
/ 29 августа 2012

Мне нравится просто вставлять эту строку в мои скрипты, где я хочу установить точку останова:

__import__('IPython').Debugger.Pdb(color_scheme='Linux').set_trace()

Более новая версия может использовать:

__import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace()
8 голосов
/ 14 июля 2009

Обычно, когда я использую ipython, я включаю автоматическую отладку с помощью команды "pdb" внутри него.

Затем я запускаю свой скрипт с командой «run myscript.py» в каталоге, где находится мой скрипт.

Если я получаю исключение, ipython останавливает программу внутри отладчика. Проверьте команду справки для команд magic ipython (% magic)

6 голосов
/ 22 января 2013

Похоже, что модули были недавно немного перемешаны. На IPython 0.13.1 у меня работает следующее

from IPython.core.debugger import Tracer; breakpoint = Tracer()

breakpoint() # <= wherever you want to set the breakpoint

Хотя, увы, в qtconsole все это бесполезно .

5 голосов
/ 27 марта 2013

Более новые версии 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 в ваш код.

3 голосов
/ 03 ноября 2010

Быстрый и легкий способ:

from IPython.Debugger import Tracer
debug = Tracer()

Тогда просто напишите

debug()

везде, где вы хотите начать отладку вашей программы.

3 голосов
/ 14 июля 2009

Из документов IPython :

import IPython.ipapi
namespace = dict(
    kissa = 15,
    koira = 16)
IPython.ipapi.launch_new_instance(namespace)

запустит оболочку IPython программно. Очевидно, что значения в namespace являются только фиктивными значениями - возможно, имеет смысл использовать locals() на практике.

Обратите внимание, что вы должны жестко закодировать это; это не будет работать так, как это делает pdb. Если это то, что вы хотите, ответ DoxaLogos, вероятно, больше похож на то, что вы ищете.

...