在“水密隔舱”中导入python模块

2024-09-29 23:22:55 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

谢谢!你知道吗


Tags: 模块对象内存selenium地方方式httplib术语
1条回答
网友
1楼 · 发布于 2024-09-29 23:22:55

没有模块的“沙盒”这种东西,没有

您可以通过重新加载模块来撤消对模块的monkey补丁:

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'键,新的导入将得到一个新的未修补版本。你知道吗

相关问题 更多 >

    热门问题