Чи можна перейти до ipython з коду?


81

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

Відповіді:


112

Існує 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)

Надзвичайно добре працює з Django. Ну, за винятком того факту, що я не бачу текст, який набираю, але це, мабуть, легко виправити (оскільки лише шість рядків ipdb).
Xiong Chiamiov

4
Насправді, проблема в тому, що Django розгалужує окремий потік для сервера запуску, і кожен раз, коли ви редагуєте код, він породжує потік. Зазвичай це працює нормально, але якщо ви сидите в PDB, коли потік вбивається, термінал стає божевільним. Ви можете це виправити, вирвавшись із runserver, запустивши "stty sane", а потім знову запустивши runserver.
Джеремі Данк,

1
@ daniel-roseman Привіт, я розумію ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell'іImportError: cannot import name 'ipapi'
SebMa

1
@memoselyk Привіт, я розумію ModuleNotFoundError: No module named 'IPython.Debugger', ModuleNotFoundError: No module named 'IPython.Shell'іImportError: cannot import name 'ipapi'
SebMa

Існує спосіб отримати breakpoint()функцію, щоб потрапити в ipdb.
геррит

53

В 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 - це дуже круто. Дуже дякую!
joon

1
Я по-дурному розмістив це всередині (майже нескінченної) петлі. Як я можу коли-небудь вибратися?
геррит

2
@gerrit, натисніть Ctrl + d, якщо ви все ще там.
збентежений00

2
@ confused00 Це було б надзвичайно нескінченно через 6 місяців ;-)
Герріт

1
@gerrit, Якщо ви застрягли у вбудованому циклі: def f() : pass ; IPython.embed = fтак, щоб embed()дзвінок був петлею, тоді Ctrl + D
MatrixManAtYrService

12

Якщо ви використовуєте більш сучасну версію IPython (> 0.10.2), ви можете використовувати щось на зразок

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

Але, мабуть, краще просто використовувати ipdb


11

Еквівалент

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

Зазвичай, коли я використовую ipython, я вмикаю автоматичну налагодження за допомогою команди "pdb".

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

Якщо я отримую виняток, ipython зупиняє програму всередині налагоджувача. Перевірте команду довідки для магічних команд ipython (% магії)


тож немає способу написати щось на зразок ipython.set_trace ()? :)
Гео

8

Мені подобається просто вставляти цей однокласник у свої сценарії, де я хочу встановити точку зупинки:

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

Нова версія може використовувати:

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

6

Схоже, нещодавно модулі трохи перетасували. На IPython 0.13.1 для мене працює наступне

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

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

На жаль, у qtconsole все це досить ні до чого .


5

Новіші версії 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

З документів IPython :

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

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

Зверніть увагу, що вам потрібно жорстко закодувати це в; це не буде працювати так, як pdbпрацює. Якщо це те, що ви хочете, відповідь DoxaLogos, швидше за все, більше схожа на те, що ви шукаєте.


3

Швидкий і простий спосіб:

from IPython.Debugger import Tracer
debug = Tracer()

Тоді просто пишіть

debug()

де б ви не хотіли розпочати налагодження вашої програми.


1
ImportError: No module named 'IPython.Debugger'на python 3.4 / IPython 3
острокач

2

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

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

(спочатку pip install ipythonі pip install ipdbзвичайно)


1
Дякую! Трохи простіше:ipython --pdb -- ./path/to/my/script --with-args here
alisianoi

0

Це досить просто:

ipython some_script.py --pdb

Він потребує встановлення iPython, зазвичай це працює: pip install ipython

Я використовую ipython3 замість ipython, тому я знаю, що це остання версія Python.

Це легко запам’ятати, оскільки ви просто використовуєте iPython замість python і додаєте --pdb до кінця.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.