Для моїх потреб налагодження pdb
це досить добре. Однак було б набагато крутіше (і корисніше), якби я міг зайти ipython
. Чи можливо це?
Відповіді:
Існує 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)
ModuleNotFoundError: No module named 'IPython.Debugger'
, ModuleNotFoundError: No module named 'IPython.Shell'
іImportError: cannot import name 'ipapi'
ModuleNotFoundError: No module named 'IPython.Debugger'
, ModuleNotFoundError: No module named 'IPython.Shell'
іImportError: cannot import name 'ipapi'
breakpoint()
функцію, щоб потрапити в ipdb.
В 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
def f() : pass ; IPython.embed = f
так, щоб embed()
дзвінок був петлею, тоді Ctrl + D
Еквівалент
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 зупиняє програму всередині налагоджувача. Перевірте команду довідки для магічних команд ipython (% магії)
Схоже, нещодавно модулі трохи перетасували. На 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 у свій код.
import IPython.ipapi
namespace = dict(
kissa = 15,
koira = 16)
IPython.ipapi.launch_new_instance(namespace)
запустить оболонку IPython програмно. Очевидно, що значення в namespace
дикті є лише фіктивними значеннями - можливо, має сенс використовувати locals()
на практиці.
Зверніть увагу, що вам потрібно жорстко закодувати це в; це не буде працювати так, як pdb
працює. Якщо це те, що ви хочете, відповідь DoxaLogos, швидше за все, більше схожа на те, що ви шукаєте.
Швидкий і простий спосіб:
from IPython.Debugger import Tracer
debug = Tracer()
Тоді просто пишіть
debug()
де б ви не хотіли розпочати налагодження вашої програми.
ImportError: No module named 'IPython.Debugger'
на python 3.4 / IPython 3
Мені довелося погуглити це пару, якщо останні кілька днів, тому додаючи відповідь ... іноді приємно мати можливість нормально запускати скрипт і лише потрапляти в ipython / ipdb на помилки, без необхідності вкладати ipdb.set_trace()
точки зупинки в код
ipython --pdb -c "%run path/to/my/script.py --with-args here"
(спочатку pip install ipython
і pip install ipdb
звичайно)
ipython --pdb -- ./path/to/my/script --with-args here
Це досить просто:
ipython some_script.py --pdb
Він потребує встановлення iPython, зазвичай це працює:
pip install ipython
Я використовую ipython3 замість ipython, тому я знаю, що це остання версія Python.
Це легко запам’ятати, оскільки ви просто використовуєте iPython замість python і додаєте --pdb до кінця.
Щоб отримати REPL IPython з використанням кольорів терміналів, мені довелося зробити це:
from IPython import start_ipython
start_ipython()
https://ipython.readthedocs.io/en/stable/api/generated/IPython.html#IPython.start_ipython