我在Python中面临一个棘手的问题:
我需要导入一个由其他人开发的Python模块(比如,module_A),这些模块导入并修补了httplib。
我还需要导入selenium,它使用httplib并且不喜欢上面的补丁
由于我无法真正修改任何一个模块,我想知道是否可以在一个“防水隔间”中导入module_A'内存(dunno,如果有更正确的术语),也就是说,模块_A中使用的所有模块都被导入为完全不同的对象,即使它们是在其他地方导入的。
谢谢!
答案 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 导入将获得一个新的未修补版本。