34

假设我有一个 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(),而不必跟踪它们所在的行号。

4

6 回答 6

34

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
于 2013-09-20T07:58:38.730 回答
21

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

run -d -b12 myscript

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

于 2013-01-31T21:22:37.357 回答
13

这是使用该set_trace()方法的版本,而不是已弃用的版本Tracer()

from IPython.core.debugger import Pdb

def my_function():
    x = 5
    Pdb().set_trace()
    print 5
于 2017-08-10T16:18:07.467 回答
8

在 IPython shell 里面,你可以做

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

例如,或者pdb.set_trace()在你的函数内部做正常的事情。

于 2013-01-31T21:21:43.927 回答
5

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

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

然后,当我运行该代码时,它会中断,我可以执行 %debug 去那里检查。您还可以打开 %pdb 以始终转到代码中断的位置,但如果您不想在每次代码中断时到处检查,这可能会很麻烦。我想要一个更优雅的解决方案。

于 2013-05-16T16:39:51.017 回答
4

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

基本上你可以设置一个指向调试器函数的环境变量。(如果不设置变量,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 的调试器。我认为这比必须 importfrom IPython.core.debugger import set_trace和 call更方便set_trace()

于 2021-04-14T09:14:44.497 回答