我在 Python 中遇到了一个棘手的问题:
我需要导入由其他人开发的 Python 模块(例如 module_A),该模块导入并猴子修补 httplib。
而且我还需要导入selenium,selenium使用的是httplib,不喜欢上面的补丁
因为我不能真正修改任何一个模块,我想知道是否可以在内存的“防水隔间”中导入 module_A(不知道是否有更正确的术语),也就是说,以所有模块的方式在 module_A 中使用的是作为完全不同的对象导入的,即使它们是在其他地方导入的。
谢谢!
最佳答案
没有模块的“沙箱”之类的东西,没有。
您可以通过重新加载模块来撤消对模块的猴子补丁:
import httplib
import module_A
reload(httplib)
这将重新导入 httplib
,将所有全局变量重置为其原始定义。保留由 module_A
设置的其他全局变量,但更改的方法和类将恢复为原始状态。
另一种方法是将模拟模块插入 sys.modules['httplib']
中,以便 module_A
进行修补,然后再次从 中删除它sys.modules
并导入真正的 httplib
模块。但是 httplib
模块本身可以比其他任何东西都更好地模拟。
另一个想法可能是尝试在打补丁后在 sys.modules
中以不同的名称重新插入打补丁的 httplib
模块,并依靠 module_A
持有对该模块中对象的引用:
import sys
import module_A
sys.modules['httplib_patched'] = sys.modules['httplib']
del sys.modules['httplib']
现在 sys.modules
中没有 'httplib'
键,新 导入会得到一个全新的未打补丁的版本。
关于python - 在 'watertight compartment' 中导入 python 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23740871/