ipython -pylab调试:我可以停止在特定行执行并放入shell吗?

时间:2011-04-27 09:24:09

标签: python numpy debugging matplotlib

编写python代码(主要是 numpy + matplotlib )时,我通常只需在 vim 中键入代码并运行程序进行测试:

python2 foo.py

偶尔,如果这还不够,我需要更彻底地检查问题,我只需在ipython中启动该程序: ipython -pylab foo.py,然后检查变量,测试一些命令等等。我喜欢ipython,因为标签已完成并且 bash 命令的可用性。

这对我来说运作得很好,但是现在我的程序变得更大并且包含许多子程序(在多个文件中)。 ipython方法不再起作用,因为它始终运行完整代码直到foo.py结束(当它进入pylab shell时)。我想要做的是,停止在子程序中的给定行执行(可能在另一个文件中)并检查那里的变量。的即。设置一个断开点,在该断点处pylab shell开始。

是否有简单方法来调整我的ipython工作方式?例如。停在bar.py

的一行
ipython -pylab --stop-at bar.py:423 foo.py

或者,停在bar.py

中的子程序名称
ipython -pylab --stop-at bar.py:subroutine-name foo.py

2 个答案:

答案 0 :(得分:5)

您可以将pdb模块导入代码,然后在您希望代码停止的位置添加pdb.set_trace()调用。 Ipython将进入交互式调试器,您可以根据需要自由选择代码。

答案 1 :(得分:5)

您可以通过在所需的位置插入以下代码来进入IPython调试会话:

import sys, IPython
IPython.Shell.IPShell(argv=[])
IPython.Debugger.Pdb(IPython.ipapi.get().options.colors).set_trace(sys._getframe())

不完全是你想要的东西,但它对我很有效。它还使得复杂的条件断点变得非常容易。还有其他一些方法可以在你的源文件中启动IPython调试会话,但是根据我的经验,这在加载正确的颜色,选项卡完成工作正常等方面是最可靠的。

调试会话启动后,您可以使用break命令设置更多断点:

ipdb> break test.py:11
Breakpoint 1 at /tmp/test.py:11
ipdb> b my_function
Breakpoint 2 at /tmp/test.py:5

为了便于插入,您可以在编辑器中设置宏/组合键。我也是Vim用户,我在vimrc中有以下键盘映射:

nmap <C-P><C-D> oimport sys, IPython<CR>IPython.Shell.IPShell(argv=[])<CR>IPython.Debugger.Pdb(IPython.ipapi.get().options.colors).set_trace(sys._getframe())<ESC>:w<CR>

在正常模式下,按Ctrl-P然后按Ctrl-D在当前行之后插入调试代码并使用正确的缩进,然后保存文件。