""" Provides utilities for dynamically loading packages/modules. """ import importlib import importlib.util import logging import os import pkgutil import sys from pathlib import Path from typing import Generator, List, Union logger = logging.getLogger(__name__) def get_module_by_path( module_name: str, file_path: Union[str, Path] ) -> "module": """ Execute and return module from *file_path* """ # https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly spec = importlib.util.spec_from_file_location(module_name, file_path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module def iter_modules( paths: List[Union[str, Path]] ) -> Generator["module", None, None]: """ Yields all modules from *paths* """ for module in pkgutil.iter_modules(paths): if not module.ispkg: path = Path(module.module_finder.path) / f"{module.name}.py" yield get_module_by_path(module.name, path) def load(name: str, missing_ok=False) -> None: """ Import *name* module, if *name* is a package import all submodules. If *name* module/package is not found: - raise ModuleNotFoundError if *missing_ok* is False - ignore it if *missing_ok* is True """ try: spec = importlib.util.find_spec(name) except ModuleNotFoundError: if not missing_ok: raise return # import *name* itself, for package it is __init__.py importlib.import_module(name) if spec.loader.is_package(spec.name): package = name for module in pkgutil.iter_modules(spec.submodule_search_locations): importlib.import_module(f"{package}.{module.name}") def load_packages(packages: tuple, missing_ok=False) -> None: for package in packages: load(package, missing_ok=missing_ok) def get(*, module, name, default): """ Return object with *name* from specific *module*. If object was not found return *default* """ try: m = importlib.import_module(module) except ModuleNotFoundError: return default return getattr(m, name, default) def exists(name): try: spec = importlib.util.find_spec(name) except ModuleNotFoundError: return False return spec is not None
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
__init__.py | File | 51.54 KB | 0644 |
|
_shutil.py | File | 795 B | 0644 |
|
antivirus_mode.py | File | 497 B | 0644 |
|
benchmark.py | File | 576 B | 0644 |
|
buffer.py | File | 1.24 KB | 0644 |
|
check_db.py | File | 7.35 KB | 0644 |
|
cli.py | File | 7.08 KB | 0644 |
|
common.py | File | 14.41 KB | 0644 |
|
config.py | File | 999 B | 0644 |
|
cronjob.py | File | 902 B | 0644 |
|
hyperscan.py | File | 149 B | 0644 |
|
importer.py | File | 2.29 KB | 0644 |
|
json.py | File | 953 B | 0644 |
|
kwconfig.py | File | 1.56 KB | 0644 |
|
parsers.py | File | 11.1 KB | 0644 |
|
resource_limits.py | File | 2.29 KB | 0644 |
|
safe_fileops.py | File | 7.96 KB | 0644 |
|
safe_sequence.py | File | 363 B | 0644 |
|
serialization.py | File | 1.72 KB | 0644 |
|
subprocess.py | File | 1.53 KB | 0644 |
|
support.py | File | 5.19 KB | 0644 |
|
threads.py | File | 1005 B | 0644 |
|
whmcs.py | File | 7.6 KB | 0644 |
|
wordpress_mu_plugin.py | File | 2.47 KB | 0644 |
|