如何创建返回另一个模块的python模块

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 +一起工作的代码,这很可能需要不同的逻辑,但是一旦我将其用于一个版本,应该不难为其他版本找到类似的方法。

wim*_*wim 5

这实际上是微不足道的。只需将其替换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