python3:导入当前模块的文件名?

时间:2017-11-10 23:24:18

标签: python-3.x python-import

假设我有一个名为pymodule的python模块,位于名为pymodule.py的文件中。

此外,假设pymodule由许多其他python程序导入,例如program0.pyprogram1.pyprogram2.py

我是否可以在pymodule.py内编写任何代码以在运行时确定导入的文件的名称?在此示例中,我们最终会使用/path/to/program0.py/path/to/program1.py/path/to/program2.py,具体取决于这三个程序中的哪一个正在运行。

当然,可能存在导入pymodule的嵌套导入组,因此在一般情况下,我理想地希望获得整组导入祖先文件名。运行时。

有没有办法在python3中执行此操作?

非常感谢。

1 个答案:

答案 0 :(得分:0)

行。我想到了。此代码可以驻留在pymodule.py ...

# This is the "parent" of the current module.
# `sys._getframe(0)` would be `pymodule.py`.
f = sys._getframe(1)
while f is not None:
    print('filename: {}'.format(f.f_code.co_filename)
    f = f.f_back

如果/path/to/program0.py正在运行,则打印出以下内容......

filename: <frozen importlib._bootstrap>
filename: <frozen importlib._bootstrap_external>
filename: <frozen importlib._bootstrap>
filename: <frozen importlib._bootstrap>
filename: <frozen importlib._bootstrap>
filename: /path/to/program0.py

所以,我所要做的就是忽略以<frozen ...开头的项目,我将获得祖先的文件名。这是一个功能......

def ancestor_importers():
    ancestors = []
    # Start with item number 2 here, because we're
    # inside of a function. Assume this function
    # resides at the top level of `pymodule`. If not,
    # the argument of sys._getframe(2) needs to be
    # adjusted accordingly.
    f = sys._getframe(2)
    while f is not None:
        fn = f.f_code.co_filename
        if not fn.startswith('<frozen '):
            ancestors.append(fn)
        f = f.f_back
    return ancestors