web-dev-qa-db-ja.com

inspectを使用してPythonの呼び出し先から呼び出し元の情報を取得する方法は?

呼び出し先から呼び出し元情報(ファイル/行)を取得する必要があります。その目的で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()
69
prosseek

呼び出し元のフレームは、現在のフレームより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)
84
unutbu

代わりに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()
43
Dmitry K.

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

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

どこ spos=0はlib関数、spos=1は呼び出し元、spos=2呼び出し元など.

1
acue