编写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
答案 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在当前行之后插入调试代码并使用正确的缩进,然后保存文件。