我使用的是一个模块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_2
的import
明确地引发一个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
中被引用。
发布于 2018-06-16 08:04:49
我能够设计出一种老生常谈的解决方案,因为如果导入了某个内容,并且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
https://stackoverflow.com/questions/50883988
复制相似问题