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


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

12 76

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 в конец.