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

时间:2019-04-13 16:19:51

标签: python python-import python-module

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

1 个答案:

答案 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