如果我想要当前模块的路径,我将使用__file__
。
现在让我们说我想要一个函数来返回它。我不能这样做:
def get_path():
return __file__
因为它将返回模块的路径,该函数已被声明。
我需要它才能工作,即使函数没有在模块的根处调用,但是在任何嵌套级别都是如此。
答案 0 :(得分:2)
我就是这样做的:
import sys
def get_path():
namespace = sys._getframe(1).f_globals # caller's globals
return namespace.get('__file__')
答案 1 :(得分:1)
在这种情况下从globals
词典中获取它:
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
在绝对/相对路径不同的旁边(为了简洁起见,让我们把它留下来),对我来说看起来不错。
答案 2 :(得分:0)
我找到了一种方法来检查模块。我对这个解决方案没问题,但是如果有人找到了一种方法来做到这一点而不会抛弃整个堆栈跟踪,它会更干净,我会感激地接受他的回答:
def get_path():
frame, filename, line_number, function_name, lines, index =\
inspect.getouterframes(inspect.currentframe())[1]
return filename