使用IPython进行Python的断点交互调试
假设我正在使用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 个回答
在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()
要方便得多。
你可以运行这个程序,并在特定的行设置一个断点,方法是:
run -d -b12 myscript
这里的 -b12 是在第12行设置一个断点。当程序运行到这一行时,它会立刻停下来进入调试模式,这时你需要输入 c
来继续执行,直到到达那个断点。
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