假设我有一个IPython会话,我从中调用一些脚本:
> run my_script.py
Run Code Online (Sandbox Code Playgroud)
有没有办法诱导断点my_script.py,我可以从IPython检查我的工作区?
我记得在以前版本的IPython中可以看到:
from IPython.Debugger import Tracer;
def my_function():
x = 5
Tracer()
print 5;
Run Code Online (Sandbox Code Playgroud)
但是子模块Debugger似乎不再可用了.
假设我已经打开了一个IPython会话:如何让我的程序停止我选择的位置并使用IPython检查我的工作区?
一般来说,我更喜欢不需要我预先指定行号的解决方案,因为我希望可能有多个这样的调用Tracer(),而不必跟踪它们所在的行号.
为了调试我的python代码,我使用了ipdb库,并使用set_trace()命令来设置断点.一旦代码到达那里,我得到一个带有ipdb>提示的交互式shell ,我可以使用制表符自动完成来探索局部变量.
但是,在IPython(Jupyter)笔记本中,ipdb.set_trace()它不起作用.正如这篇文章所建议的:
使用ipdb在一个单元格中调试python代码(jupyter或Ipython)
我使用以下替代方法进行交互式调试:
from IPython.core.debugger import Tracer
Tracer()() #this one triggers the debugger
Run Code Online (Sandbox Code Playgroud)
这为我提供了ipdb>提示,但标签自动完成功能不可用.无论如何使用ipython笔记本启用自动完成交互式调试?这非常有用,特别是当你有很多长名称的变量时.
在Jupyter Notebook中使用调试器时,我一直遇到问题,特别是以下命令:
from IPython.core.debugger import Tracer
Tracer()() #this one triggers the debugger
Run Code Online (Sandbox Code Playgroud)
每当我使用Tracer()()时,内联调试器就会按预期显示,但是一旦在字段中输入任何命令:n(ext),s(tep)等,我就会跳到该行:
finally:
# Reset our crash handler in place
sys.excepthook = old_excepthook
Run Code Online (Sandbox Code Playgroud)
这是问题和尝试调试的代码的图像(确切的代码无关,因为我能够在其他笔记本上重现该问题)。
我正在Mac上运行OSX El Capitan,并使用Anaconda for python 2.7。这是有关通过运行获得的当前设置的一些详细信息:
conda info --all (from root env)
Run Code Online (Sandbox Code Playgroud)
注意,我尝试了几种不同的调试选项:pdb,ipdb和Tracer(),但是每个选项都遇到了单独的问题。根据Stackoverflow问题(使用ipdb调试Jupyter中的Python代码),此时 Tracer()似乎是标准选项。
此外,我已经能够在运行Windows 7的Dell计算机上复制此问题。
任何帮助将不胜感激!