我想在我的模块f()
中定义一个实用程序函数m
,以便
m.f()
中调用了/foo/a.py
,则会返回/foo/a.py
m.f()
中调用了/bar/baz/b.py
,则会返回/bar/baz/b.py
直观地,我将f()
解释为"它会返回来电者的__file__
"但我怎么能真正实现它(如果可能的话)?
注意def f(): return __file__
只要我拨打/path/to/m.py
,就会返回m.f()
,而这不是我想要的。
答案 0 :(得分:3)
some.py:
m.f()
m.py:
import inspect
import os
def f():
return os.path.relpath(
inspect.stack()[1][1],
basePath)
# returns path to caller file relative to some basePath
答案 1 :(得分:1)
__file__
是加载的模块的属性。因此m.__file__
将始终提供加载m
的文件的路径。要使其适用于任何模块,您应该调用该特定模块的属性。
import module
def f(m): return m.__file__
print f(module)
答案 2 :(得分:1)
查看inspect
模块。它有一个handy stack()
method,它返回整个调用堆栈,其中每个元素都包含文件名。你只需要提取最后一个。