83

对于我的调试需求,pdb还是不错的。但是,如果我能进入ipython. 这件事可能吗?

4

13 回答 13

113

有一个ipdb项目将 iPython 嵌入到标准 pdb 中,所以你可以这样做:

import ipdb; ipdb.set_trace()

它可以通过通常的pip install ipdb.

ipdb很短,因此您也可以ipdb.py在 Python 路径的某个位置创建一个文件,而不是 easy_installing,然后将以下内容粘贴到文件中:

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)
于 2009-07-14T18:18:53.763 回答
56

在 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
于 2011-09-14T05:00:59.857 回答
12

如果您使用的是更现代的 IPython (> 0.10.2) 版本,则可以使用类似

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

但最好只使用 ipdb

于 2012-09-21T10:41:44.447 回答
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调用放置在您需要中断的任何地方。

于 2009-07-15T00:40:39.690 回答
8

我喜欢简单地将这个单行代码粘贴到我想要设置断点的脚本中:

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

较新的版本可能会使用:

__import__('IPython').core.debugger.Pdb(color_scheme='Linux').set_trace()
于 2012-08-29T11:58:31.033 回答
8

通常,当我使用 ipython 时,我会使用其中的“pdb”命令打开自动调试。

然后我在我的脚本所在的目录中使用“run myscript.py”命令运行我的脚本。

如果我遇到异常,ipython 会在调试器中停止程序。查看魔术 ipython 命令的帮助命令 (%magic)

于 2009-07-14T18:08:30.150 回答
6

看起来模块最近被改组了。在 IPython 0.13.1 上,以下对我有用

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

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

尽管如此,在 qtconsole 中这一切都毫无价值。

于 2013-01-22T17:43:14.703 回答
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 shell 时使用。这将允许您在代码中嵌入(甚至嵌套)IPython 解释器。

于 2013-03-27T17:22:12.257 回答
3

来自IPython 文档

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

将以编程方式启动 IPython shell。显然 dict 中的值只是虚拟值 -在实践namespace中使用可能更有意义。locals()

请注意,您必须将其硬编码;它不会像现在这样工作pdb。如果这就是您想要的,DoxaLogos 的答案可能更像您正在寻找的。

于 2009-07-14T18:15:32.897 回答
3

如果最近几天我不得不用谷歌搜索几次,所以添加一个答案......有时能够正常运行脚本并且只在出现错误时才进入 ipython/ipdb 是很好的,而不必ipdb.set_trace()在代码中放置断点

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

(首先pip install ipythonpip install ipdb当然)

于 2015-03-16T17:11:12.390 回答
3

快速简便的方法:

from IPython.Debugger import Tracer
debug = Tracer()

然后就写

debug()

无论您想在哪里开始调试程序。

于 2010-11-03T12:57:03.640 回答
0

要使用终端颜色获得 IPython 的 REPL,我必须这样做:

from IPython import start_ipython

start_ipython()

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

于 2020-01-18T20:23:23.620 回答
0

这很简单:

ipython some_script.py --pdb

它需要安装 iPython,通常这样可以: pip install ipython

我使用 ipython3 而不是 ipython,所以我知道它是 Python 的最新版本。

这很容易记住,因为您只需使用 iPython 而不是 python,并将 --pdb 添加到末尾。

于 2018-08-02T13:21:31.543 回答