Python:调用者的__file__

时间:2016-06-13 14:17:50

标签: python

我想在我的模块f()中定义一个实用程序函数m,以便

  1. 如果在m.f()中调用了/foo/a.py,则会返回/foo/a.py
  2. 如果在m.f()中调用了/bar/baz/b.py,则会返回/bar/baz/b.py
  3. 直观地,我将f()解释为"它会返回来电者的__file__"但我怎么能真正实现它(如果可能的话)?

    注意def f(): return __file__只要我拨打/path/to/m.py,就会返回m.f(),而这不是我想要的。

3 个答案:

答案 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,它返回整个调用堆栈,其中每个元素都包含文件名。你只需要提取最后一个。