Hoe inspect gebruiken om de informatie van de beller van callee in Python te krijgen?

Ik heb de bellerinfo (welk bestand/welke regel) nodig van callee. Ik heb geleerd dat ik de inpect-module daarvoor voor doeleinden kan gebruiken, maar niet precies hoe.

Hoe krijg ik die informatie met inspecteren? Of is er een andere manier om de informatie te krijgen?

import inspect
print __file__
c=inspect.currentframe()
print c.f_lineno
def hello():
    print inspect.stack
    ?? what file called me in what line?
hello()

Antwoord 1, autoriteit 100%

Het frame van de beller is één frame hoger dan het huidige frame. U kunt inspect.currentframe().f_backom het frame van de beller te vinden.
Gebruik vervolgens inspect.getframeinfoom de bestandsnaam en het regelnummer van de beller te krijgen .

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)

Antwoord 2, autoriteit 45%

Ik raad aan om in plaats daarvan inspect.stackte gebruiken:

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()

Antwoord 3, autoriteit 2%

Ik heb een wrapper gepubliceerd voor inspectie met eenvoudige stackframe-adressering die het stackframe bedekt met een enkele parameter spos:

Bijvoorbeeld pysourceinfo.PySourceInfo.getCallerLinenumber(spos=1)

waar spos=0de lib-functie is, spos=1de beller is, spos=2de beller-van-de -beller, enz.


Antwoord 4

Als de aanroeper het hoofdbestand is, gebruik dan gewoon sys.argv[0]

Other episodes