如何在未捕获的异常中打印绝对行号?

时间:2012-06-08 02:51:50

标签: python debugging exception

发生错误时,Python打印出类似这样的内容:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "<stdin>", line 8, in m
  File "<stdin>", line 5, in exec_st
  File "<stdin>", line 9, in exec_assign
  File "<stdin>", line 48, in ref_by_id
IndexError: list index out of range

其中2,...,48是不太方便的相对行号。如何在此类错误消息中打印绝对行号?

编辑: 也许这是一个愚蠢的问题,但回答将有助于发展。 我在几个文件中打印文本。完成后,按快捷键运行python并将当前文件的内容复制到控制台。建议的解决方案强制按下多余的击键(Ctrl + S,Alt + Tab)并创建其他文件。我希望我已经说清楚了。

2 个答案:

答案 0 :(得分:2)

几分钟的黑客攻击让我在Python 2.7中使用了这个Read-Eval-Print循环:

#!/usr/bin/env python
import code
import sys

LINE_NUMBER=0

def reset_linenum():
    global LINE_NUMBER
    LINE_NUMBER=-1

def resettable_REPL():
    global LINE_NUMBER
    BUFFERED_LINES=[]
    ii=code.InteractiveInterpreter({"reset_linenum":reset_linenum})
    while True:
        try:
            BUFFERED_LINES.append(raw_input("!"+sys.ps1)+'\n')
            while (BUFFERED_LINES[-1][:1] in " \t" or
                   ii.runsource("\n"*LINE_NUMBER+"".join(BUFFERED_LINES), "console")):
                BUFFERED_LINES.append(raw_input("!"+sys.ps2)+'\n')
            LINE_NUMBER+=len(BUFFERED_LINES)
            BUFFERED_LINES=[]
        except EOFError:
            break

if __name__=='__main__':
    resettable_REPL()

它有点hackish,但它会在会话继续时跟踪行号,并允许通过调用reset_linenum()重置当前计数。示例会话:

!!!> print "hello"              # line 1
hello
!!!> def badfunc():             # line 2
!...     raise Exception("doh") # line 3
!!!> badfunc()                  # line 4
Traceback (most recent call last):
  File "console", line 4, in <module>
  File "console", line 3, in badfunc
Exception: doh
!!!> ?                          # line 5
  File "console", line 5
    ?
    ^
SyntaxError: invalid syntax
!!!> reset_linenum()            # RESET
!!!> raise Exception("!")       # line 1
Traceback (most recent call last):
  File "console", line 1, in <module>
Exception: !
!!!> 

编辑:修正REPL不要过早地执行缩进块。

答案 1 :(得分:1)

在Linux上这样做?不要让你的热键直接调用python,而是让它调用这个shell脚本:

#!/bin/bash
cat > /tmp/$$.py
/usr/bin/env python /tmp/$$.py
rm -f $$.py

您也可以尝试(甚至可以在Windows上运行):

import sys
exec(compile("".join([line for line in sys.stdin]), "console", "single"))