在“水密隔间”中导入python模块'

时间:2014-05-19 14:51:40

标签: python import copy

我在Python中面临一个棘手的问题:

  • 我需要导入一个由其他人开发的Python模块(比如,module_A),这些模块导入并修补了httplib。

  • 我还需要导入selenium,它使用httplib并且不喜欢上面的补丁

由于我无法真正修改任何一个模块,我想知道是否可以在一个“防水隔间”中导入module_A'内存(dunno,如果有更正确的术语),也就是说,模块_A中使用的所有模块都被导入为完全不同的对象,即使它们是在其他地方导入的。

谢谢!

1 个答案:

答案 0 :(得分:2)

没有模块的“沙箱”,没有。

您可以通过重新加载模块将猴子补丁撤消到模块:

import httplib
import module_A
reload(httplib)

这将重新导入httplib,将所有全局变量重置为原始定义。由module_A设置的其他全局变量将被保留,但更改的方法和类将恢复为其原始状态。

替代方法是将模拟模块插入sys.modules['httplib'] module_A进行修补,然后再从sys.modules中删除并导入真实的httplib模块。但是httplib模块本身可以比其他任何模块更好。

另一个想法可能是在修补后尝试在httplib中以不同的名称重新插入已修补的sys.modules模块,并依靠module_A持有对该模块中对象的引用:

import sys
import module_A

sys.modules['httplib_patched'] = sys.modules['httplib']
del sys.modules['httplib']

现在'httplib'中没有sys.modules个密钥,而 new 导入将获得一个新的未修补版本。