从库中获取调用者文件的路径
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])
我希望能够获取导入我的 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])