我应该如何定义一个函数where
,它可以告诉它执行的位置,没有传入参数?
〜/ 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
答案 0 :(得分:11)
您需要使用inspect.stack()
:
from inspect import stack
def where():
caller_frame = stack()[1]
return caller_frame[0].f_globals.get('__file__', None)
甚至:
def where():
caller_frame = stack()[1]
return caller_frame[1]
答案 1 :(得分:3)
您可以使用traceback.extract_stack
:
import traceback
def where():
return traceback.extract_stack()[-2][0]
答案 2 :(得分:1)
import sys
if __name__ == '__main__':
print sys.argv[0]
sys.argv [0]始终是正在运行的文件的名称/路径,即使没有传入参数
答案 3 :(得分:0)
基于此...
print where() # I want where() to return '~/app/b.py' like __file__ in b.py
...听起来更像你想要的是你正在执行的脚本的合格路径。
在这种情况下,试试......
import sys
import os
if __name__ == '__main__':
print os.path.realpath(os.path.join(os.getcwd(), os.path.expanduser(__file__)))
使用realpath()
应该处理从符号链接运行脚本的情况。