【问题标题】:Import python module in 'watertight compartment'在“防水隔间”中导入 python 模块
【发布时间】:2014-05-19 14:51:40
【问题描述】:

我在 Python 中遇到了一个棘手的问题:

  • 我需要导入由其他人开发的 Python 模块(例如 module_A),该模块会导入 httplib 并对其进行猴子补丁。

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

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

谢谢!

【问题讨论】:

    标签: python import copy


    【解决方案1】:

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

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

    import httplib
    import module_A
    reload(httplib)
    

    这将重新导入httplib,将所有全局变量重置为其原始定义。由module_A 设置的其他全局变量被保留,但更改的方法和类将恢复到其原始状态。

    替代方法是将模拟模块插入sys.modules['httplib'] 以供module_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']
    

    现在sys.modules 中没有'httplib' 键,new 导入将获得一个全新的未修补版本。

    【讨论】:

    • 是的,但是如果我重新加载 httplib,那么依赖于 httplib 修补版本的 module_A 将不再工作。我最终将 httplib.py 复制到 module_A 的文件夹中,以便将其作为不同的对象加载。肮脏,但它的工作原理!
    • @bruno:对,不,那里存在固有的不兼容性。我有另一个想法,试试吧。
    猜你喜欢
    • 2011-02-24
    • 2013-12-13
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2018-02-02
    • 2011-10-15
    相关资源
    最近更新 更多