如何临时覆盖导入行为?

2024-03-28 18:58:17 发布

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

我使用的是一个模块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机制,使module_2import具体地引发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编辑模块的字典,我认为它会在import中引用。你知道吗


Tags: 模块keyimportselfmodulesinit系统def
1条回答
网友
1楼 · 发布于 2024-03-28 18:58:17

我能够设计出一种黑客的解决方案,因为导入系统会抛出一个importorror,如果有东西被导入并系统模块有一个None

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

相关问题 更多 >