Можно ли перейти в ipython из кода?

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

Ответ 1

Существует проект 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)

Ответ 2

В 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 features.
%quickref -> Quick reference.
help      -> Python 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

Ответ 3

Эквивалент

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

Ответ 4

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

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

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

Ответ 5

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

Затем я запускаю свой script с помощью команды "run myscript.py" в каталоге, где находится мой script.

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

Ответ 6

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

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

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

__import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace()

Ответ 7

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

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

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

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

Ответ 8

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

Ответ 9

Из Документы IPython:

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

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

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

Ответ 10

Быстрый и простой способ:

from IPython.Debugger import Tracer
debug = Tracer()

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

debug()

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

Ответ 11

Мне пришлось пропустить эту пару пару раз за последние несколько дней, так что добавление ответа... иногда приятно нормально запускать script и просто переходить на ipython/ipdb на ошибки, без необходимости ставить ipdb.set_trace() точки останова в код

ipython --pdb -c "%run path/to/my/script.py --with-args here"

(сначала pip install ipython и pip install ipdb, конечно)