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

Seb*_*ian 5 python debugging numpy 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
Run Code Online (Sandbox Code Playgroud)

或者,停在子程序名称中 bar.py

ipython -pylab --stop-at bar.py:subroutine-name foo.py
Run Code Online (Sandbox Code Playgroud)

tal*_*ies 5

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


Bla*_*air 5

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

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

不完全是你想要的东西,但它对我很有效.它还使得复杂的条件断点变得非常容易.还有其他一些方法可以在您的源文件中启动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
Run Code Online (Sandbox Code Playgroud)

为了便于插入,您可以在编辑器中设置宏/键组合.我也是一个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>
Run Code Online (Sandbox Code Playgroud)

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