我正在尝试制作python模块,该模块在导入时的行为与另一个模块完全相同。
python>
import foo
import fake_foo
help(foo) == help(fake_foo)
我需要这个,因为我需要在fake_foo
模块内添加一些额外的代码mafic代码,以便从另一个位置动态加载实际模块。
如果不清楚下面的代码出于明显的原因 not 不起作用:load_source确实返回了模块,但是它不能告诉python将其加载到当前模块。
# fake_foo/__init__.py
import imp
imp.load_source('foo', '/path/to/foo')
一个非常重要的要求是,我无法控制人们如何导入fake_foo
,不能修改执行导入的代码,我需要在假模块内完成整个实现。
PS。我将需要适用于py27,py35 +的代码 这将需要不同的逻辑,但是一旦我将其用于一个版本,应该不难为其他版本找到类似的方法。
答案 0 :(得分:5)
这实际上是微不足道的。只需替换为sys.modules
。
在匀场模块中:
# mod1.py
import sys
import mod2
sys.modules["mod1"] = mod2
在实际模块中:
# mod2.py
var = 'hello'
演示:
>>> import mod1
>>> mod1
<module 'mod2' from 'mod2.py'>
>>> mod1.var
'potato'
这可能看起来很hacky,但这是Python中的一个功能-导入机制有意允许这种技巧。
这是有效的,因为导入机制正在积极启用此功能 hack,最后一步是将实际模块拉出
sys.modules
,加载后。 (这绝非偶然。 早就提出来了,我们决定在此过程中给予足够的支持 进口机械。)
来自GvR:https://mail.python.org/pipermail/python-ideas/2012-May/014969.html