如果我想要当前模块的路径,我将使用__file__
.
现在假设我想要一个函数来返回它。我不能这样做:
def get_path():
return __file__
因为它将返回已在其中声明函数的模块的路径。
即使不是在模块的根目录而是在任何嵌套级别调用该函数,我也需要它工作。
我会这样做:
import sys
def get_path():
namespace = sys._getframe(1).f_globals # caller's globals
return namespace.get('__file__')
在这种情况下从globals
dict 中获取它:
def get_path():
return globals()['__file__']
编辑以回应评论:给定以下文件:
# a.py
def get_path():
return 'Path from a.py: ' + globals()['__file__']
# b.py
import a
def get_path():
return 'Path from b.py: ' + globals()['__file__']
print get_path()
print a.get_path()
运行它会给我以下输出:
C:\workspace>python b.py
Path from b.py: b.py
Path from a.py: C:\workspace\a.py
除了绝对/相对路径不同(为简洁起见,让我们忽略它),它对我来说看起来不错。
我找到了一种使用检查模块的方法。我对这个解决方案没意见,但如果有人找到一种方法来做到这一点而不倾倒整个堆栈跟踪,它会更干净,我会感激地接受他的回答:
def get_path():
frame, filename, line_number, function_name, lines, index =\
inspect.getouterframes(inspect.currentframe())[1]
return filename