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

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

12 ответов

Решение

Есть 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)

В 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

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

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

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

Эквивалент

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".

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

Если я получаю исключение, ipython останавливает программу внутри отладчика. Проверьте команду help для команд 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:

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()

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

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

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

(первый pip install ipython а также pip install ipdb конечно)

Чтобы получить REPL IPython с использованием цветов терминала, мне пришлось сделать следующее:

from IPython import start_ipython

start_ipython()

https://ipython.readthedocs.io/en/stable/api/generated/IPython.html

Это довольно просто:

ipython some_script.py --pdb

Требуется установка iPython, обычно это работает:pip install ipython

Я использую ipython3 вместо ipython, поэтому я знаю, что это последняя версия Python.

Это легко запомнить, потому что вы просто используете iPython вместо python и добавляете --pdb до конца.

Другие вопросы по тегам