91

呼び出し先から発信者情報(どのファイル/どの行)を取得する必要があります。そのためにinpectモジュールを使用できることを学びましたが、正確な方法ではありません。

検査でそれらの情報を取得する方法は?または、情報を取得する他の方法はありますか?

import inspect

print __file__
c=inspect.currentframe()
print c.f_lineno

def hello():
    print inspect.stack
    ?? what file called me in what line?

hello()
4

4 に答える 4

111

発信者のフレームは、現在のフレームより1フレーム高くなっています。を使用inspect.currentframe().f_backして、発信者のフレームを見つけることができます。次に、inspect.getframeinfoを使用して、発信者のファイル名と行番号を取得します。

import inspect

def hello():
    previous_frame = inspect.currentframe().f_back
    (filename, line_number, 
     function_name, lines, index) = inspect.getframeinfo(previous_frame)
    return (filename, line_number, function_name, lines, index)

print(hello())

# ('/home/unutbu/pybin/test.py', 10, '<module>', ['hello()\n'], 0)
于 2010-09-14T17:12:23.247 に答える
50

代わりに使用することをお勧めしますinspect.stack

import inspect

def hello():
    frame,filename,line_number,function_name,lines,index = inspect.stack()[1]
    print(frame,filename,line_number,function_name,lines,index)
hello()
于 2014-03-13T12:16:42.673 に答える
2

単一のパラメーターでスタックフレームをカバーする単純なスタックフレームアドレス指定で検査するためのラッパーを公開しましたspos

例えばpysourceinfo.PySourceInfo.getCallerLinenumber(spos=1)

ここspos=0で、はlib関数、spos=1は呼び出し元、spos=2呼び出し元の呼び出し元などです。

于 2016-07-05T20:48:02.150 に答える
-5

呼び出し元がメインファイルの場合は、sys.argv[0]を使用するだけです。

于 2016-04-12T20:15:55.137 に答える