我正在使用一个模块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
中引用。
答案 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