2010-09-14 5 views
62

Je dois obtenir l'information de l'appelant (quel fichier/quelle ligne) de callee. J'ai appris que je peux utiliser le module inpect à cette fin, mais pas exactement comment.Comment utiliser inspecter pour obtenir l'information de l'appelant de l'appelé en Python?

Comment obtenir ces informations avec inspection? Ou y a-t-il un autre moyen d'obtenir l'info?

import inspect 

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

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

hello() 

Répondre

67

La trame de l'appelant est une image supérieure à la trame actuelle. Vous pouvez utiliser inspect.currentframe().f_back pour trouver le cadre de l'appelant. Ensuite, utilisez inspect.getframeinfo pour obtenir le nom de fichier et le numéro de ligne de l'appelant.

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

# (<frame object at 0x8ba7254>, '/home/unutbu/pybin/test.py', 10, '<module>', ['hello()\n'], 0) 
+0

merci pour la réponse. Comment puis-je obtenir l'appelant de l'appelant? – prosseek

+4

@prosseek: Pour obtenir l'appelant, changez simplement l'index '[1 ]' en' [2] '. ('inspect.getouterframes' renvoie une liste d'images ...). Python est magnifiquement organisé. – unutbu

+3

Vous pouvez également utiliser inspect.currentframe(). F_back. – yoyo

36

Je suggère d'utiliser à la place 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() 
+0

Comment est-ce préférable d'utiliser 'getouterframes' comme suggéré par @unutbu? – ixe013

+7

Il est plus compact et reflète mieux l'intention. –

+0

Notez que 'getouterframes (currentframe())' et 'stack()' sont équivalents sous le capot https://github.com/python/cpython/blob/master/Lib/inspect.py#L1442 – ubershmekel

-4

Si l'appelant est le fichier principal, utilisez simplement sys.argv [0]

Questions connexes