如何暂时覆盖导入行为?

时间:2018-06-16 00:04:49

标签: python python-3.5 python-import

我正在使用一个模块module_1,如果它安装在系统上,则可以使用module_2,但如果不是,则可以使用其他实现。它检查module_2是否为:

的方式
# module_1.__init__.py

try:
    import module_2
    _MODULE2 = True
except ImportError:
    _MODULE2 = False

我在同一环境中安装了module_2,但我不希望module_1使用它。

有没有办法import module_1,但可以覆盖import机制,使import module_2专门提出ImportError

我尝试过的事情:

import sys
class hide_module_2:
    def __enter__(self):
        class HideModule2(dict):
            def __init__(self, *args, **kwargs):
                self.update(*args, **kwargs)

            def __getitem__(self, key):
                if key == 'module_2':
                    raise ImportError('Module 2 de')
                super().__getitem__(key)
        sys.modules = NoPandas(**sys.modules)

    def __exit__(self, exc_type, exc_value, traceback):
        # revert to regular dictionary
        sys.modules = dict(**sys.modules)

with hide_module_2():
    import module_1

我认为这会有效,因为sys.modules是当前import ed模块的字典,我认为它会在import中引用。

1 个答案:

答案 0 :(得分:0)

我能够设计出一种hacky解决方案,因为导入系统会在导入某些内容并且sys.modules中包含None时抛出ImportError:

class hide_module_2:   
    def __enter__(self):
        self.module_2 = sys.modules.get('module_2')
        sys.modules['module_2'] = None

    def __exit__(self, exc_type, exc_value, traceback):
        if self.module_2 is None:
          sys.modules.pop('module_2')
        else:
          sys.modules['module_2'] = self.module_2

with hide_module_2():
    import module_1