0

エラーが発生すると、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) を押して、追加のファイルを作成することを強制します。私はそれを明確にしたことを願っています。

4

2 に答える 2

2

数分間ハッキングすると、Python2.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()

少しハックですが、セッションが続く間、行番号を追跡し、の呼び出しによって現在のカウントをリセットできるようにし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を修正しました。

于 2012-06-08T04:16:57.657 に答える
1

Linuxでこれを行いますか?ホットキーで python を直接呼び出す代わりに、次のシェル スクリプトを呼び出します。

#!/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"))
于 2012-06-08T04:49:02.587 に答える