web-dev-qa-db-fra.com

Comment utiliser inspect pour obtenir les informations de l'appelant de l'appelé en Python?

J'ai besoin d'obtenir les informations de l'appelant (quel fichier/quelle ligne) de l'appelé. J'ai appris que je peux utiliser le module inpect à cette fin, mais pas exactement comment.

Comment obtenir ces informations avec inspect? Ou existe-t-il un autre moyen d'obtenir les informations?

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

La trame de l'appelant est supérieure d'une trame à la trame actuelle. Vous pouvez utiliser inspect.currentframe().f_back pour trouver le cadre de l'appelant. Utilisez ensuite 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())

# ('/home/unutbu/pybin/test.py', 10, '<module>', ['hello()\n'], 0)
84
unutbu

Je suggère d'utiliser inspect.stack au lieu:

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.

J'ai publié un wrapper pour inspecter avec un adressage stackframe simple couvrant le cadre de la pile par un seul paramètre spos:

Par exemple. pysourceinfo.PySourceInfo.getCallerLinenumber(spos=1)

spos=0 est la fonction lib, spos=1 est l'appelant, spos=2 l'appelant-de-l'appelant, etc.

1
acue