Source code for jammy.utils.imp

import importlib
import os
import sys

__all__ = [
    "load_module",
    "load_module_filename",
    "load_source",
    "tuple_to_classname",
    "classname_to_tuple",
    "load_class",
    "module_vars_as_dict",
]


[docs]def load_module(module_name): module = importlib.import_module(module_name) return module
[docs]def load_module_filename(module_filename): assert module_filename.endswith(".py") realpath = os.path.realpath(module_filename) pos = realpath.rfind("/") dirname, module_name = realpath[0:pos], realpath[pos + 1 : -3] sys.path.insert(0, dirname) module = load_module(module_name) del sys.path[0] return module
[docs]def load_source(filename, name=None): import imp # pylint: disable=import-self if name is None: basename = os.path.basename(filename) if basename.endswith(".py"): basename = basename[:-3] name = basename.replace(".", "_") return imp.load_source(name, filename) # pylint: disable=arguments-out-of-order
[docs]def tuple_to_classname(t): assert len(t) == 2, ( "Only tuple with length 2 (module name, class name) can be converted to classname, " "got {}, {}.".format(t, len(t)) ) return ".".join(t)
[docs]def classname_to_tuple(classname): pos = classname.rfind(".") if pos == -1: return "", classname else: return classname[0:pos], classname[pos + 1 :]
[docs]def load_class(classname, exit_on_error=True): if isinstance(classname, str): classname = classname_to_tuple(classname) elif isinstance(classname, tuple): assert ( len(classname) == 2 ), "Classname should be tuple of length 2 or a single string." module_name, clz_name = classname try: module = load_module(module_name) clz = getattr(module, clz_name) return clz except ImportError as e: print( "Cannot import {}.{}, with original error message: {}.".format( module_name, clz_name, str(e) ) ) if exit_on_error: import traceback traceback.print_stack() exit(1) return None
[docs]def module_vars_as_dict(module): res = {} for k in dir(module): if not k.startswith("__"): res[k] = getattr(module, k) return res