使用IPython进行Python的断点交互调试

42 投票
8 回答
32040 浏览
提问于 2025-04-17 14:22

假设我正在使用IPython这个工具,并且从中调用了一个脚本:

> run my_script.py

有没有办法在my_script.py中设置一个断点,这样我就可以从IPython中检查我的工作空间呢?

我记得以前的IPython版本中可以这样做:

from IPython.Debugger import Tracer;     

def my_function():
    x = 5
    Tracer()
    print 5;

但是现在似乎没有这个Debugger子模块了。

假设我已经打开了一个IPython会话:我该如何在我选择的位置停止程序,并用IPython检查我的工作空间呢

一般来说,我更希望能有不需要提前指定行号的解决方案,因为我可能会在上面多次调用Tracer(),而不想去记住它们的行号。

8 个回答

19

在Python 3(版本3.7及以上)中,有一个新的函数叫做 breakpoint()。你可以修改它的行为,让它为你调用ipython的调试器。

简单来说,你可以通过 设置一个环境变量,这个变量指向一个调试器函数。(如果你不设置这个变量,breakpoint() 默认会调用pdb调试器。)

要让 breakpoint() 调用ipython的调试器,你可以在你的命令行中这样设置环境变量:

# for bash/zsh users
export PYTHONBREAKPOINT='IPython.core.debugger.set_trace'
# powershell users
$env:PYTHONBREAKPOINT='IPython.core.debugger.set_trace'

(当然,如果你想永久设置这个环境变量,你需要修改你的命令行配置文件或系统设置。)

你可以写:

def my_function():
    x = 5
    breakpoint()
    print(5)

这样就会进入ipython的调试器。我觉得这比每次都要导入 from IPython.core.debugger import set_trace 并调用 set_trace() 要方便得多。

21

你可以运行这个程序,并在特定的行设置一个断点,方法是:

run -d -b12 myscript

这里的 -b12 是在第12行设置一个断点。当程序运行到这一行时,它会立刻停下来进入调试模式,这时你需要输入 c 来继续执行,直到到达那个断点。

39

Tracer() 这个东西在 ipython 里还存在,只是放在了不同的模块里。你可以这样做:

from IPython.core.debugger import Tracer

def my_function():
    x = 5
    Tracer()()
    print 5

注意在 Tracer 周围多了一个括号。

补充说明: 从 IPython 6 版本开始,Tracer 已经不推荐使用,所以你应该改用 set_trace()

from IPython.core.debugger import set_trace

def my_function():
    x = 5
    set_trace()
    print 5

撰写回答