1

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

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

def get_path():
    return __file__

因为它将返回已在其中声明函数的模块的路径。

即使不是在模块的根目录而是在任何嵌套级别调用该函数,我也需要它工作。

4

3 回答 3

2

我会这样做:

import sys

def get_path():
    namespace = sys._getframe(1).f_globals  # caller's globals
    return namespace.get('__file__')
于 2012-10-30T15:16:32.320 回答
1

在这种情况下从globalsdict 中获取它:

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

除了绝对/相对路径不同(为简洁起见,让我们忽略它),它对我来说看起来不错。

于 2012-10-30T10:38:24.673 回答
0

我找到了一种使用检查模块的方法。我对这个解决方案没意见,但如果有人找到一种方法来做到这一点而不倾倒整个堆栈跟踪,它会更干净,我会感激地接受他的回答:

def get_path():
    frame, filename, line_number, function_name, lines, index =\
        inspect.getouterframes(inspect.currentframe())[1]
    return filename
于 2012-10-30T11:41:58.460 回答