Python 编写一个PEP-302导入钩子,该钩子知道哪个模块正在导入哪个模块

Python 编写一个PEP-302导入钩子,该钩子知道哪个模块正在导入哪个模块,python,import-hooks,Python,Import Hooks,假设我有模块foo.py和bar.py,它们的代码中都有import baz语句 我想写一个导入钩子,可以插入sys.meta_path,它知道baz是从foo还是从bar导入的 我之所以想这样做,是因为我希望我的应用程序能够加载插件并保持它们的依赖关系隔离,就像我在Java中使用单独的ClassLoader实例那样。这样,pluginfoo和pluginbar就能够捆绑不同版本的librarybaz而不会产生冲突。我要实现这一点的方法是,根据语句的来源,更改导入机制,为import baz语句

假设我有模块
foo.py
bar.py
,它们的代码中都有
import baz
语句

我想写一个导入钩子,可以插入
sys.meta_path
,它知道
baz
是从
foo
还是从
bar
导入的

我之所以想这样做,是因为我希望我的应用程序能够加载插件并保持它们的依赖关系隔离,就像我在Java中使用单独的
ClassLoader
实例那样。这样,plugin
foo
和plugin
bar
就能够捆绑不同版本的library
baz
而不会产生冲突。我要实现这一点的方法是,根据语句的来源,更改导入机制,为
import baz
语句生成单独的模块


如果有人有更好的方法,请在回答中提出。

不要这样做。Python模块是单例的,这样做会破坏这个不变量,这可能会在以后导致很多麻烦(可能是意外的)。您可以捆绑类中需要的所有状态,并使用类的实例而不是模块。(例如,
import baz;mybaz=baz.create_state()
)您没有抓住要点。如果保证
baz
是我的模块,我就可以这样做,但是
baz
是其他人的库,比如PyYAML或sh?从独立插件的角度来看,每个模块都是一个单独的模块。我不会在每次有人试图导入新模块时都实例化它。PEP 302钩子的引入是为了允许从非标准格式导入(请参阅PEP的“用例”部分),它们不是为了创建同一模块的多个副本。将它们用于非设计用途可能会在某个时候咬到你。无论如何,您可能对该模块感兴趣,以获取有关哪个模块正在执行导入的信息,尤其是与堆栈相关的函数。