【问题标题】:Make IPython show source code line where exception occurred使 IPython 显示发生异常的源代码行
【发布时间】:2014-06-29 21:12:01
【问题描述】:

我对 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 以某种方式混合在一起 脚本文件的路径和当前工作目录。

当抛出异常时,我可以做些什么来获得更多有用的信息?

【问题讨论】:

    标签: python debugging exception ipython


    【解决方案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
    

    【讨论】:

    • 我用from scd_experiments import * 导入了代码。当我使用import scd_experiments as exp 导入时,我会获得异常的行号,但前提是我留在脚本目录中。如果我cd 进入工作目录,问题再次出现。
    • 我相信工作目录的变化是问题所在。当我从 IPython 提示符或从脚本通过 os.chdir cd 时,我丢失了行号。
    • 我无法重现这些症状。即使我使用from script import *,我也会得到有用的回溯,cd-ing 对我没有影响。我正在使用 IPython 版本 2.0.0-dev。
    • 啊。如果(对我而言)script.py 不在我的 PYTHONPATH 中列出的目录中,我可以重现该问题。因此,请尝试将包含 scd_experiments 的目录添加到您的 PYTHONPATH 中。
    • 如果发生错误,message应该指向source的行号,否则是一个bug。请通过bugs.launchpad.net/python-mode 举报
    【解决方案2】:

    unutbu 的 WRT 回答:

    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 系列的东西由交互式处理 (一)Python外壳。这允许进一步的交互 调查。背面由 lp:1253907 显示 - 产量大时,comint 簿记可能会使 Emacs 慢,分别。冻结。

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

    对于 6.1.3 版本,可选的 py-fast-process-p 不是 尚未发布,可在后备箱中使用。

    【讨论】:

    • 我认为这是 IPython 中的一个错误,但 emacs 与它有什么关系?
    • @cls an Emacs python-mode bug was shown in answer of unutbu,因为错误不应该指向临时文件,而是指向原始源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多