替换导入的模块依赖

Replacing an imported module dependency

As described here,在 python 中,可以使用 sys.modules:

替换当前模块实现
import somemodule

import sys
del sys.modules['somemodule']
sys.modules['somemodule'] = __import__('somefakemodule')

但是如果import somemodule是在另一个导入模块的代码中完成的,它就不起作用:

在这个例子中:

自定义模块

import somemodule

def f():
    print(somemodule.someFunction())

客户端代码

from CustomModule import f

import sys
del sys.modules['somemodule']
sys.modules['somemodule'] = __import__('somefakemodule')    

f() #Will use `somemodule.someFunction`

f的调用将使用somemodule.someFunction,而不是somefakemodule.someFunction

是否可以在不更改其代码的情况下使 CustomModule 将其对 somemodule 的使用替换为 somefakemodule?即从ClientCode.

somemodule 替换为 somefakemodule ,然后 导入 CustomModule:

import sys
del sys.modules['somemodule']
sys.modules['somemodule'] = __import__('somefakemodule')    

from CustomModule import f

这样,当CustomModule执行

import somemodule

Python 将在 sys.modules 和 return 缓存模块中找到 somemodulesomefakemodule.