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