¿Determinar dónde se ejecutó una función?

¿Cómo debo definir una función, where , que puede decir dónde se ejecutó, sin que se pasen argumentos? todos los archivos en ~ / app /

a.py:

 def where(): return 'the file name where the function was executed' 

b.py:

 from a import where if __name__ == '__main__': print where() # I want where() to return '~/app/b.py' like __file__ in b.py 

c.py:

 from a import where if __name__ == '__main__': print where() # I want where() to return '~/app/c.py' like __file__ in c.py 

inspect.stack() buscar la stack de llamadas utilizando inspect.stack() :

 from inspect import stack def where(): caller_frame = stack()[1] return caller_frame[0].f_globals.get('__file__', None) 

o incluso:

 def where(): caller_frame = stack()[1] return caller_frame[1] 

Puedes usar traceback.extract_stack :

 import traceback def where(): return traceback.extract_stack()[-2][0] 
 import sys if __name__ == '__main__': print sys.argv[0] 

sys.argv [0] es siempre el nombre / ruta del archivo en ejecución, incluso sin argumentos pasados

Basado en esto…

 print where() # I want where() to return '~/app/b.py' like __file__ in b.py 

… suena más como lo que quieres es la ruta calificada del script que estás ejecutando.

En cuyo caso, intente …

 import sys import os if __name__ == '__main__': print os.path.realpath(os.path.join(os.getcwd(), os.path.expanduser(__file__))) 

El uso de realpath() debe hacer frente al caso en el que está ejecutando el script desde un enlace simbólico.