python - 在 'watertight compartment' 中导入 python 模块

标签 python import copy

我在 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/

相关文章:

python - 如何使用 PIL 裁剪图像?

python - 默认 login_required 而不是到处添加装饰器

Python - 相对导入

sql-server - 将表从服务器1 DB“A”复制到服务器2 DB“B”的SQL Server T-SQL过程

amazon-s3 - 带有 ContentEncoding 参数的 boto3 s3 copy_object

python - 使用 Python 创建一个交叉表(可能/有点,不确定它叫什么)

python - 如何在 Tkinter 中设置窗口的背景图像

Golang导入路径最佳实践

database - 如何修复从远程服务器将 EE 数据库导入本地主机时收到的 #1062 错误

Ruby 文件强制复制