例如,我有两个.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
复制相似问题