如何在Python中从已执行但未在其中声明的函数中获取模块的文件路径?

时间:2012-10-30 10:33:09

标签: python filepath

如果我想要当前模块的路径,我将使用__file__

现在让我们说我想要一个函数来返回它。我不能这样做:

def get_path():
    return __file__

因为它将返回模块的路径,该函数已被声明。

我需要它才能工作,即使函数没有在模块的根处调用,但是在任何嵌套级别都是如此。

3 个答案:

答案 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