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

时间:2013-01-31 21:16:33

标签: python debugging breakpoints ipython

说我有一个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()以上而不必跟踪行它们所在的数字。

6 个答案:

答案 0 :(得分:29)

{i}中的Tracer()仍然存在于另一个模块中。您可以执行以下操作:

from IPython.core.debugger import Tracer

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

请注意Tracer

附近的附加调用括号

修改:对于IPython 6及更高版本Tracer is deprecated,您应该使用set_trace()代替:

from IPython.core.debugger import set_trace

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

答案 1 :(得分:19)

您可以运行它并在给定行设置断点:

run -d -b12 myscript

其中-b12在第12行设置断点。当您输入此行时,您将立即进入pdb,并且您需要输入c来执行该断点。

答案 2 :(得分:11)

这是使用set_trace()方法而非弃用Tracer()方法的版本。

from IPython.core.debugger import Pdb

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

答案 3 :(得分:6)

在IPython shell中,你可以做到

from IPython.core.debugger import Pdb
pdb = Pdb()
pdb.runcall(my_function)
例如

,或者在你的函数中执行正常的pdb.set_trace()

答案 4 :(得分:5)

我一直有同样的问题和我发现的最好的解决方法是非常hackey是添加一行会破坏我的代码,如下:

...
a = 1+2
STOP
...

然后,当我运行该代码时,它将会中断,我可以执行%debug以进行检查。您还可以打开%pdb,始终指向代码中断的位置,但如果您不想在任何地方进行检查以及每次代码中断时,这都会很麻烦。我希望有一个更优雅的解决方案。

答案 5 :(得分:2)

在 Python 3 (v3.7+) 中,有新的 breakpoint() 函数。您可以修改它的行为,以便它为您调用 ipython 的调试器。

基本上你可以 set an environment variable 指向一个调试器函数。 (如果不设置变量,breakpoint() 默认调用 pdb。)

要设置 breakpoint() 以调用 ipython 的调试器,请像这样设置环境变量(在您的 shell 中):

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

(注意,显然如果你想永久设置环境变量,你需要修改你的 shell 配置文件或系统首选项。)

你可以写:

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

它会为你闯入 ipython 的调试器。我认为这比导入 from IPython.core.debugger import set_trace 并调用 set_trace() 更方便。