【问题标题】:Python: __file__ of the callerPython:调用者的__file__
【发布时间】:2016-10-14 00:16:19
【问题描述】:

我想在我的模块m 中定义一个实用函数f(),这样

  1. 如果在/foo/a.py 中调用m.f(),则返回/foo/a.py
  2. 如果在/bar/baz/b.py 中调用m.f(),则返回/bar/baz/b.py

直观地说,我会将f() 解释为“它返回调用者的__file__”,但我怎样才能真正实现它(如果可能的话?)

注意def f(): return __file__ 在我调用m.f() 的任何地方都会返回/path/to/m.py,这不是我想要的。

【问题讨论】:

标签: python


【解决方案1】:

一些.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

【讨论】:

  • 好吧,inspect.stack()[1][1] 对我来说还可以
  • 从 3.5 版本开始,返回一个命名元组,从而提供更易读的版本:inspect.stack()[1].filename
【解决方案2】:

__file__ 是加载模块的属性。所以m.__file__ 将始终给出加载m 的文件的路径。要使其适用于任何模块,您应该调用该特定模块的属性。

import module

def f(m): return m.__file__

print f(module)

【讨论】:

    【解决方案3】:

    看看inspect 模块。它有一个handy stack() method,它返回整个调用堆栈,其中的每个元素都包含文件名。你只需要提取最后一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-10
      • 2011-03-28
      • 1970-01-01
      • 2022-11-03
      • 2016-11-19
      • 1970-01-01
      • 2014-03-23
      • 2016-09-18
      相关资源
      最近更新 更多