blob: 9df166d0cda7cc275fe97b754453cadcd78973d5 [file] [log] [blame]
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from __future__ import print_function
import importlib
import logging
from py_utils import modules_util
# Map of module names to their required min/max version.
# DEPRECATED: Do not add new modules to this dict. New external depencencies
# should be provided via vpython instead. See: crbug.com/777865.
MODULES = {
'cv2': ('2.4.8', '3.0.0'),
'numpy': ('1.8.0', '1.12.0'),
'psutil': ('0.5.0', None),
}
def ImportRequiredModule(module):
"""Tries to import the desired module (DEPRECATED).
External modules should be provided via vpython and imported using the
regular python `import` statement. To ensure a particular module version
has been loaded use modules_util.RequireVersion instead.
Returns:
The module on success, raises error on failure.
Raises:
ImportError: The import failed."""
versions = MODULES.get(module)
if versions is None:
raise NotImplementedError('Please teach telemetry about module %s.' %
module)
module = importlib.import_module(module)
modules_util.RequireVersion(module, *versions)
return module
def ImportOptionalModule(module):
"""Tries to import the desired module (DEPRECATED).
External modules should be provided via vpython and imported using the
regular python `import` statement. To ensure a particular module version
has been loaded use modules_util.RequireVersion instead.
Returns:
The module if successful, None if not."""
try:
return ImportRequiredModule(module)
except ImportError as e:
# This can happen due to a circular dependency. It is usually not a
# failure to import module_name, but a failed import somewhere in
# the implementation. It's important to re-raise the error here
# instead of failing silently.
if 'cannot import name' in str(e):
print('Possible circular dependency!')
raise
logging.warning('Unable to import %s due to: %s', module, e)
return None