假设我有一个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