断点诱导的 Python 与 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()进行多个这样的调用,而不必跟踪它们所在的行号。

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

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

run -d -b12 myscript

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

这是

使用 set_trace() 方法而不是已弃用的Tracer()

方法的版本。
from IPython.core.debugger import Pdb
def my_function():
    x = 5
    Pdb().set_trace()
    print 5

在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的调试器。我认为这比必须导入from IPython.core.debugger import set_trace并调用set_trace()更方便.

在 IPython shell 中,你可以做

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

例如,或者在函数内执行正常pdb.set_trace()

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

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

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

我在这里看到很多选项,但可能不是以下简单选项。在my_script.py所在的目录中启动 ipython。如果希望代码在失败时进入调试模式,请打开调试器。键入 %pdb

In [1]: %pdb
Automatic pdb calling has been turned ON

下一个类型

In [2]: %run -d ./my_script.py
*** Blank or comment
*** Blank or comment
NOTE: Enter 'c' at the ipdb>  prompt to continue execution.
> c:usersc81196lgdmortgages-1nmblgdrun_lgd.py(2)<module>()
      1 # system imports
----> 2 from os.path import join

现在,您可以在所需的任何位置设置断点。键入 b 100 以在第 100 行具有断点,或键入 b whatever.py:102 以在第 102 行具有断点 whatever.py。例如:

ipdb> b 100

然后继续运行或继续。

ipdb> c

一旦代码失败或到达断点,您就可以开始使用 python 调试器的全部功能pdb

请注意,pdb还允许在函数上设置断点。

b(reak) [([filename:]lineno | function) [, condition]]

因此,您不一定需要使用行号。

如果您使用的是pytest

pip install ipython
pip install ipdb
# run tests with options
pytest --pdb --pdbcls=IPython.terminal.debugger:TerminalPdb
# or set it in pytest.ini
[pytest]
addopts = --pdbcls=IPython.terminal.debugger:TerminalPdb

相关内容

  • 没有找到相关文章

最新更新