sor*_*rin 3 python python-module python-import
我正在尝试使python模块在导入时的行为与另一个模块完全相同。
python>
import foo
import fake_foo
help(foo) == help(fake_foo)
Run Code Online (Sandbox Code Playgroud)
我需要这样做是因为我需要在fake_foo模块内部添加一些额外的代码mafic代码,以便从另一个位置动态加载实际模块。
如果不清楚,下面的代码由于明显的原因而不能正常工作:load_source确实返回了模块,但是它不能告诉python将其加载到当前模块。
# fake_foo/__init__.py
import imp
imp.load_source('foo', '/path/to/foo')
Run Code Online (Sandbox Code Playgroud)
一个非常重要的要求是,我无法控制人们的导入方式fake_foo,无法修改执行导入的代码,我需要在假模块内部进行整个实现。
PS。我将需要与py27,py35 +一起工作的代码,这很可能需要不同的逻辑,但是一旦我将其用于一个版本,应该不难为其他版本找到类似的方法。
这实际上是微不足道的。只需将其替换sys.modules。
在匀场模块中:
# mod1.py
import sys
import mod2
sys.modules["mod1"] = mod2
Run Code Online (Sandbox Code Playgroud)
在实际模块中:
# mod2.py
var = 'hello'
Run Code Online (Sandbox Code Playgroud)
演示:
>>> import mod1
>>> mod1
<module 'mod2' from 'mod2.py'>
>>> mod1.var
'potato'
Run Code Online (Sandbox Code Playgroud)
这看似很麻烦,但这是Python 的功能 -导入机制有意允许这种技巧。
之所以可行,是因为导入机制正在积极地启用此hack,并且
sys.modules在加载的最后一步将实际模块从中拉出 。(这绝非偶然。黑客是在很久以前就提出的,我们认为我们很喜欢在进口机器中提供支持。)
从GvR:https ://mail.python.org/pipermail/python-ideas/2012-May/014969.html