| """ | |
| Stand-alone module to provide information about whether optional deps exist. | |
| """ | |
| from __future__ import absolute_import | |
| from importlib import import_module | |
| import logging | |
| import sys | |
| logger = logging.getLogger(__name__) | |
| _not_importable = set() | |
| def get_module(name, should_load=True): | |
| """ | |
| Return module or None. Absolute import is required. | |
| :param (str) name: Dot-separated module path. E.g., 'scipy.stats'. | |
| :raise: (ImportError) Only when exc_msg is defined. | |
| :return: (module|None) If import succeeds, the module will be returned. | |
| """ | |
| if name in sys.modules: | |
| return sys.modules[name] | |
| if not should_load: | |
| return None | |
| if name not in _not_importable: | |
| try: | |
| return import_module(name) | |
| except ImportError: | |
| _not_importable.add(name) | |
| except Exception as e: | |
| _not_importable.add(name) | |
| msg = f"Error importing optional module {name}" | |
| logger.exception(msg) | |