Python 在';水密隔舱';
我在Python中面临一个棘手的问题:Python 在';水密隔舱';,python,import,copy,Python,Import,Copy,我在Python中面临一个棘手的问题: 我需要导入一个由其他人开发的Python模块(比如,模块a),该模块导入和修改httplib补丁 我还需要导入selenium,它使用httplib,不喜欢上面的补丁 由于我不能真正修改这两个模块,我想知道是否有可能将模块A导入内存的“防水隔间”(不知道是否有更正确的术语),也就是说,以这样一种方式,模块A中使用的所有模块都作为完全不同的对象导入,即使它们是在其他地方导入的 谢谢 没有模块的“沙箱”之类的东西,没有 您可以通过重新加载模块来撤消对模块的
- 我需要导入一个由其他人开发的Python模块(比如,模块a),该模块导入和修改httplib补丁
- 我还需要导入selenium,它使用httplib,不喜欢上面的补丁
谢谢 没有模块的“沙箱”之类的东西,没有 您可以通过重新加载模块来撤消对模块的monkey修补程序:
import httplib
import module_A
reload(httplib)
这将重新导入httplib
,将所有全局变量重置为其原始定义。由module_A
设置的其他全局变量将被保留,但更改的方法和类将恢复为其原始状态
另一种方法是将模拟模块插入sys.modules['httplib']
中,以便module\u 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
,新的导入将获得一个新的未修补版本。是,但如果重新加载httplib,则依赖于修补版本的httplib的模块a将不再工作。最后,我将httplib.py复制到模块_A的文件夹中,以便将其作为不同的对象加载。肮脏,但它能工作@布鲁诺:对,不,这是一种内在的不相容性。我有另一个主意,试试看。