""" This is some common utils functions. it is not binding to the scenarios or framework (So it is not placed in rdagent.core.utils) """ # TODO: merge the common utils in `rdagent.core.utils` into this folder # TODO: split the utils in this module into different modules in the future. import importlib import re import sys from types import ModuleType from typing import Union def get_module_by_module_path(module_path: Union[str, ModuleType]): """Load module from path like a/b/c/d.py or a.b.c.d :param module_path: :return: :raises: ModuleNotFoundError """ if module_path is None: raise ModuleNotFoundError("None is passed in as parameters as module_path") if isinstance(module_path, ModuleType): module = module_path else: if module_path.endswith(".py"): module_name = re.sub("^[^a-zA-Z_]+", "", re.sub("[^0-9a-zA-Z_]", "", module_path[:-3].replace("/", "_"))) module_spec = importlib.util.spec_from_file_location(module_name, module_path) module = importlib.util.module_from_spec(module_spec) sys.modules[module_name] = module module_spec.loader.exec_module(module) else: module = importlib.import_module(module_path) return module