2024-09-29 23:22:55 发布
网友
我在Python中面临一个棘手的问题:
我需要导入一个由其他人开发的Python模块(比如,moduleïa),该模块导入并修补httplib。
我还需要导入selenium,它使用httplib,不喜欢上面的补丁
由于我不能真正修改这两个模块,我想知道是否有可能将模块\u A导入内存的“防水隔室”(不知道是否有更正确的术语),也就是说,以这样一种方式,模块\u A中使用的所有模块都作为完全不同的对象导入,即使它们是在其他地方导入的。你知道吗
谢谢!你知道吗
没有模块的“沙盒”这种东西,没有
您可以通过重新加载模块来撤消对模块的monkey补丁:
import httplib import module_A reload(httplib)
这将重新导入httplib,将所有全局变量重置为其原始定义。由module_A设置的其他全局变量将被保留,但更改的方法和类将恢复到其原始状态。你知道吗
httplib
module_A
另一种方法是将模拟模块插入sys.modules['httplib']以便module_A进行修补,然后再次将其从sys.modules中删除并导入真正的httplib模块。但是httplib模块本身可以比其他任何模块都更好。你知道吗
sys.modules['httplib']
sys.modules
另一个想法是,在修补之后,尝试在sys.modules中的不同名称下重新插入修补后的httplib模块,并指望module_A持有对该模块中对象的引用:
import sys import module_A sys.modules['httplib_patched'] = sys.modules['httplib'] del sys.modules['httplib']
现在在sys.modules中没有'httplib'键,新的导入将得到一个新的未修补版本。你知道吗
'httplib'
没有模块的“沙盒”这种东西,没有
您可以通过重新加载模块来撤消对模块的monkey补丁:
这将重新导入
httplib
,将所有全局变量重置为其原始定义。由module_A
设置的其他全局变量将被保留,但更改的方法和类将恢复到其原始状态。你知道吗另一种方法是将模拟模块插入
sys.modules['httplib']
以便module_A
进行修补,然后再次将其从sys.modules
中删除并导入真正的httplib
模块。但是httplib
模块本身可以比其他任何模块都更好。你知道吗另一个想法是,在修补之后,尝试在
sys.modules
中的不同名称下重新插入修补后的httplib
模块,并指望module_A
持有对该模块中对象的引用:现在在
sys.modules
中没有'httplib'
键,新的导入将得到一个新的未修补版本。你知道吗相关问题 更多 >
编程相关推荐