Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在';水密隔舱';_Python_Import_Copy - Fatal编程技术网

Python 在';水密隔舱';

Python 在';水密隔舱';,python,import,copy,Python,Import,Copy,我在Python中面临一个棘手的问题: 我需要导入一个由其他人开发的Python模块(比如,模块a),该模块导入和修改httplib补丁 我还需要导入selenium,它使用httplib,不喜欢上面的补丁 由于我不能真正修改这两个模块,我想知道是否有可能将模块A导入内存的“防水隔间”(不知道是否有更正确的术语),也就是说,以这样一种方式,模块A中使用的所有模块都作为完全不同的对象导入,即使它们是在其他地方导入的 谢谢 没有模块的“沙箱”之类的东西,没有 您可以通过重新加载模块来撤消对模块的

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

  • 我需要导入一个由其他人开发的Python模块(比如,模块a),该模块导入和修改httplib补丁

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

由于我不能真正修改这两个模块,我想知道是否有可能将模块A导入内存的“防水隔间”(不知道是否有更正确的术语),也就是说,以这样一种方式,模块A中使用的所有模块都作为完全不同的对象导入,即使它们是在其他地方导入的


谢谢

没有模块的“沙箱”之类的东西,没有

您可以通过重新加载模块来撤消对模块的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的文件夹中,以便将其作为不同的对象加载。肮脏,但它能工作@布鲁诺:对,不,这是一种内在的不相容性。我有另一个主意,试试看。