在编写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
您可以将pdb模块导入代码,然后在希望代码停止的位置添加pdb.set_trace()调用。 Ipython将进入交互式调试器,您可以根据需要自由选择代码。
您可以通过在所需的位置插入以下代码来进入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在当前行之后插入调试代码并使用正确的缩进,然后保存文件。