2010-09-14 13 views
62

Necesito obtener la información de la persona que llama (qué archivo/qué línea) de callee. Aprendí que puedo usar el módulo inpect para eso, pero no exactamente cómo.¿Cómo utilizar inspeccionar para obtener la información de la persona que llama de callee en Python?

¿Cómo obtener esa información con inspeccionar? ¿O hay alguna otra forma de obtener la información?

import inspect 

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

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

hello() 

Respuesta

67

El fotograma de la persona que llama es un fotograma más alto que el fotograma actual. Puede usar inspect.currentframe().f_back para encontrar el marco de la persona que llama. Luego use inspect.getframeinfo para obtener el nombre de archivo y el número de línea de la persona que llama.

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

gracias por la respuesta. ¿Cómo puedo obtener la llamada de la persona que llama? – prosseek

+4

@prosseek: Para obtener la llamada de la persona que llama, simplemente cambie el índice '[1]' a '[2]'. ('inspect.getouterframes' devuelve una lista de marcos ...). Python está bellamente organizado. – unutbu

+3

También puede usar inspect.currentframe(). F_back. – yoyo

36

sugeriría utilizar inspect.stack lugar:

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

¿Cómo es mejor que usar 'getouterframes' como lo sugiere @unutbu? – ixe013

+7

Es más compacto y refleja mejor la intención. –

+0

Tenga en cuenta que 'getouterframes (currentframe())' y 'stack()' son equivalentes bajo el capó https://github.com/python/cpython/blob/master/Lib/inspect.py#L1442 – ubershmekel

-4

Si la persona que llama es el archivo principal, sólo tiene que utilizar sys.argv [0]

Cuestiones relacionadas