54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
from importlib.util import module_from_spec, spec_from_file_location
|
|
from os import getcwd, path, walk
|
|
from pathlib import Path
|
|
|
|
# =================================================================================
|
|
|
|
|
|
# Import functions
|
|
# Took from https://stackoverflow.com/a/57892961
|
|
def get_py_files(src):
|
|
cwd = getcwd() # Current Working directory
|
|
py_files = []
|
|
for root, dirs, files in walk(src):
|
|
py_files.extend(
|
|
Path(f"{cwd}/{root}/{file}") for file in files if file.endswith(".py")
|
|
)
|
|
return py_files
|
|
|
|
|
|
def dynamic_import(module_name, py_path):
|
|
try:
|
|
module_spec = spec_from_file_location(module_name, py_path)
|
|
module = module_from_spec(module_spec) # type: ignore
|
|
module_spec.loader.exec_module(module) # type: ignore
|
|
return module
|
|
except SyntaxError:
|
|
print(
|
|
f"Could not load extension {module_name} due to invalid syntax. Check logs/errors.log for details.",
|
|
flush=True,
|
|
)
|
|
return
|
|
except Exception as exp:
|
|
print(f"Could not load extension {module_name} due to {exp}", flush=True)
|
|
return
|
|
|
|
|
|
def dynamic_import_from_src(src, star_import=False):
|
|
my_py_files = get_py_files(src)
|
|
for py_file in my_py_files:
|
|
module_name = Path(py_file).stem
|
|
print(f"Importing {module_name} extension...", flush=True)
|
|
imported_module = dynamic_import(module_name, py_file)
|
|
if imported_module != None:
|
|
if star_import:
|
|
for obj in dir(imported_module):
|
|
globals()[obj] = imported_module.__dict__[obj]
|
|
else:
|
|
globals()[module_name] = imported_module
|
|
print(f"Successfully loaded {module_name} extension", flush=True)
|
|
return
|
|
|
|
|
|
# =================================================================================
|