def import_plugins(self, module): """ Import plugins from ``module``. :param module: Name of the module to import. This might be a wildcard in the form ```package.*``` in which case all modules from the given package are loaded. """ if module.endswith('.*'): subpackage = module[:-2] try: plugins = importlib.import_module(subpackage) except ImportError as e: self.log.error("cannot import plugins sub-package %s: %s", subpackage, e) raise package, dot, part = subpackage.rpartition('.') parent = sys.modules[package] parent_dir = path.dirname(path.abspath(parent.__file__)) plugins_dir = path.dirname(path.abspath(plugins.__file__)) if parent_dir == plugins_dir: raise errors.PluginsPackageError( name=subpackage, file=plugins.__file__ ) self.log.debug("importing all plugin modules in %s...", subpackage) modules = find_modules_in_dir(plugins_dir) modules = ['.'.join((subpackage, name)) for name in modules] else: modules = [module] for name in modules: self.log.debug("importing plugin module %s", name) try: module = importlib.import_module(name) except errors.SkipPluginModule as e: self.log.debug("skipping plugin module %s: %s", name, e.reason) except Exception as e: if self.env.startup_traceback: import traceback self.log.error("could not load plugin module %s\n%s", name, traceback.format_exc()) raise else: self.add_module(module)
def add_package(self, package): """ Add plugin modules from the ``package``. :param package: A package from which to add modules. """ package_name = package.__name__ package_file = package.__file__ package_dir = path.dirname(path.abspath(package_file)) parent = sys.modules[package_name.rpartition('.')[0]] parent_dir = path.dirname(path.abspath(parent.__file__)) if parent_dir == package_dir: raise errors.PluginsPackageError( name=package_name, file=package_file ) self.log.debug("importing all plugin modules in %s...", package_name) modules = getattr(package, 'modules', find_modules_in_dir(package_dir)) modules = ['.'.join((package_name, name)) for name in modules] for name in modules: self.log.debug("importing plugin module %s", name) try: module = importlib.import_module(name) except errors.SkipPluginModule as e: self.log.debug("skipping plugin module %s: %s", name, e.reason) continue except Exception as e: if self.env.startup_traceback: import traceback self.log.error("could not load plugin module %s\n%s", name, traceback.format_exc()) raise try: self.add_module(module) except errors.PluginModuleError as e: self.log.debug("%s", e)