【问题标题】:ipython -pylab debugging: Can I stop the execution at a specific line and drop into the shell?ipython -pylab 调试:我可以在特定行停止执行并放入 shell 吗?
【发布时间】:2011-04-27 09:24:08
【问题描述】:

在写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

【问题讨论】:

  • 顺便说一下,ipython-pdb 选项只有在捕获到异常时才调用 python 调试器。这不是我要找的。​​span>

标签: python numpy debugging matplotlib


【解决方案1】:

您可以将 pdb 模块导入代码中,然后在您希望停止代码的位置添加 pdb.set_trace() 调用。 Ipython 将进入交互式调试器,您可以随意单步执行您的代码。

【讨论】:

  • 感谢您的回答@talonmies。您的建议实际上启动了调试器而不是 ipython/pylab shell。但是,如果我按下 Ctrl+D,我实际上是在 ipython/pylab shell 的正确位置!但是,我不太高兴:1. bar.py 中的额外行对于快速测试来说确实不合理,2. python2 foo.py 也将启动调试器...
  • 您可以轻松地将调试断点设置为有条件的,并且仅在交互式运行或特定模块特定于命令行的解释器时设置条件。如果您不明白如何做到这一点,我可以将示例编辑到答案中。
  • 当我使用 Ctrl+D 退出调试器时,我被放到了 ipython/pylab shell。这是可以接受的,但它在子程序中不起作用。 :-(
【解决方案2】:

您可以通过在所需位置插入以下代码来进入 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 会在当前行之后插入带有正确缩进的调试代码,然后保存文件。

【讨论】:

  • 感谢@Blair 的回答。我测试了你的建议,可以确认它有效。基本上我看到的行为与@talonmies 回答中的行为相同,但具有颜色和自动完成功能。按下 Ctrl-D 后,我就在我想要的地方(ipython/pylab shell)。不过,您的 vim 快捷方式很有帮助。 +1
  • 供参考:最新版本的 Ipython 没有 Ipython.Shell 属性。要放入 shell,您应该使用 from IPython import embed embed()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多