从库中获取调用者文件的路径

Get Path To File of Caller From Within Library

我希望能够获取导入我的 python 库的文件的路径。我该怎么做?

例如:

用户在 C:\Users\Bob\bobsproject\main.py 创建了一个文件。从库中,我希望能够获取文件的路径,并将其作为 txt 读取。我该怎么做?

如果您想获取正在(可能间接地)加载您的库的驱动程序脚本的名称,您可以使用 python 运行 名称下的脚本这一事实 __main__. You can get it from sys.modules just like any other module and access its __file__属性如果存在:

import sys

try:
    print(sys.modules['__main__'].__file__)
except KeyError:
    print('libray not loaded from script')
except AttributeError:
    print('script not loaded from file')

KeyError 不太可能发生(即使您 运行 使用 python -m 的脚本也不会),但为了安全起见很有用。 AttributeError 更有可能,并且可以很容易地用 python -c.

之类的东西来证明

如果您想要更复杂的东西,例如包含实际调用您的库函数的代码的文件,您可能必须使用 inspect 模块或类似模块。当然,这会更不稳健,但仍可能满足您的需求:

import inspect

module = inspect.getmodule(inspect.stack()[1][0])
try:
    print(module.__file__)
except AttributeError:
    print(f'module "{module.__name__}" not loaded from file')

请注意 inspect.getmodule explicitly uses the word "guess" in its official documentation, while inspect.stack 有时可能是个烦躁的野兽。

此处引用的第二部分代码:.

请记住这里有两个选项。如果您将这段代码直接放在您的库模块中,它将在第一次导入模块时恰好执行一次。如果你把它放在一个用户可以直接调用的函数中,你每次都会看到打印输出。如果将第二个片段放在实用函数中,然后从 public 模块函数调用,请不要忘记增加帧索引以反映这一点:

module = inspect.getmodule(inspect.stack()[2][0])