例如,我有两个.py文件module1
和module2
。
module2
使用import
语句导入module1
。
我希望在module1
中有一些方法来检测(从module1
本身)哪些模块正在导入它。在这种情况下,module2将导入它。
我所做的:,如果我从module2
导入module1
,我看到module1
具有__loader__
和__spec__
全局vars。__loader__
包含<class '_frozen_importlib_external.SourceFileLoader'>
,__spec__
包含<class '_frozen_importlib.ModuleSpec'>
,__spec__.loader
与__loader__
相同。
如果我写
print(__loader__.path)
在module1
内部,它给出了module1
的完整路径。
我想要的东西:,我希望在module1
中有一些代码来获得module2
的路径。(不是module1
__loader__.path
给出的路径)。
发布于 2022-11-08 07:26:15
Python中的导入实际上是对importlib
中函数的调用,因此您只需要通过检查调用堆栈中的框架来获取调用者在importlib
中调用函数的信息。
但是,由于导入系统的实现细节不同,调用堆栈中的实际调用方的框架在不同的Python版本之间有所不同,所以最好迭代调用堆栈并过滤掉importlib
中的内部调用,这些调用可以通过尖括号中的文件名来标识。
找到文件名不以角括号开头的帧后,使用inspect.getmodule
获取其模块信息。
import inspect
print(next(inspect.getmodule(f[0]).__file__
for f in inspect.stack()[1:] if not f.filename.startswith('<')))
https://stackoverflow.com/questions/74356449
复制相似问题