让IPython显示发生异常的源代码行

时间:2014-05-12 13:18:49

标签: python debugging exception ipython

我对IPython给出异常的以下输出感到恼火:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-3-4c27956d23f6> in <module>()
----> 1 parameterStudyPageRankNibble()

/Users/cls/Desktop/LFR/scripts/scd_experiments.py in parameterStudyPageRankNibble()

AttributeError: 'tuple' object has no attribute 'values'
  • 引发异常的行号实际上是
    很有帮助。为什么不在那里?
  • /Users/cls/Desktop/LFR/scripts/scd_experiments.py不是执行脚本的路径。 IPython以某种方式混合在一起 脚本文件的路径和当前的工作目录。

如果抛出异常,我该怎么做才能获得更多有用的信息?

2 个答案:

答案 0 :(得分:1)

这与如何将代码加载到IPython中有关。 (如果你告诉我们如何重现你的问题会很有帮助。) 例如,如果我使用emacs的M-x py-execute-region,则代码区域将复制到临时文件,IPython解释器将在临时文件上运行execfile

以这种方式使用emacs / IPython时,没有有用的回溯。

相反,如果您导入脚本,然后调用函数:

import scd_experiments as SE
SE.parameterStudyPageRankNibble()

然后你会看到一个有用的追溯信息。


演示:script.py

def foo():
    1/0

如果我选择了该地区并致电M-x py-execute-region

In [15]: ## working on region in file /tmp/python-4126aNj.py...

In [16]: foo()
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-16-624891b0d01a> in <module>()
----> 1 foo()

/tmp/python-4126aNj.py in foo()

ZeroDivisionError: integer division or modulo by zero

但是如果我导入模块:

In [19]: import script
In [20]: script.foo()
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-20-3ae0d96fd279> in <module>()
----> 1 script.foo()

/home/unutbu/pybin/script.py in foo()
      8 
      9 def foo():
---> 10     1/0

ZeroDivisionError: integer division or modulo by zero

答案 1 :(得分:0)

WRT通过unutbu回答:

python-mode.el不应该只说“模块”,而是显示调用的缓冲区或文件的名称,似乎有些东西被打破了:

https://bugs.launchpad.net/python-mode/+bug/1318991

执行source时默认也必须读取导入, 这里不需要明确设置PYTHONPATH。

在上下文中可能值得一提:

py-execute -...命令可以根据选项使用与默认值不同的后端

  • python-mode-v5-behavior-p
  • py-execute-no-temp-p
  • py-fast-process-p

使用python-mode.el v5系列 shell-command-on-region。那个时候存在bug lp:550661,WRT unicode符号u'\ xA9',©

通过运行来自的东西可以避免这个错误 临时文件。哪个是默认值。一个 从Python发送的错误消息比指向的 临时文件 - 需要在。处理 Emacs方面。

由于用户希望保持简单的旧程序,  python-mode-v5-behavior-p是作为选项提供的。

为了在没有系统的情况下加速和/或执行 写权限,较新的后端避免写入 临时文件。内在依赖 process-send-string。自定义py-execute-no-temp-p 启用它。

v6系列内容由交互式处理 (I)Python shell。这允许进一步的互动 调查。背面由lp显示:1253907 - 具有大量输出,可以使用comint簿记 相比之下,Emacs变慢了。冻结。

因此引入了选项`py-fast-process-p' - 参见 菜单“Python / Fast process ...”避免使用Python shell, 结果到达缓冲区“* Python输出*”。

对于6.1.3版,可选的py-fast-process-p不是 已发布,可在主干中使用。