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

问题描述 投票:5回答:2

在编写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
python numpy debugging matplotlib
2个回答
5
投票

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


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

© www.soinside.com 2019 - 2024. All rights reserved.