|
|
|
|
|
|
|
|
|
|
| import contextlib
|
| import importlib
|
| import inspect
|
| import os
|
| import sys
|
| from pathlib import Path
|
|
|
|
|
| @contextlib.contextmanager
|
| def _load_modules_from_dir(dir_: str):
|
| sys.path.insert(0, dir_)
|
| yield
|
| sys.path.pop(0)
|
|
|
|
|
| def load_custom_callable(module_path: str | Path, callable_name: str):
|
| module_full_path = os.path.realpath(module_path)
|
| assert os.path.exists(module_full_path), f"module {module_full_path} does not exist"
|
| module_dir, module_filename = os.path.split(module_full_path)
|
| module_name, _ = os.path.splitext(module_filename)
|
|
|
| with _load_modules_from_dir(module_dir):
|
| module = importlib.import_module(module_name)
|
| if inspect.getfile(module) != module_full_path:
|
| importlib.reload(module)
|
| callable_ = getattr(module, callable_name)
|
|
|
| return callable_
|
|
|
|
|
| @contextlib.contextmanager
|
| def change_working_dir_and_pythonpath(new_dir):
|
| old_dir = Path.cwd()
|
| new_dir = Path(new_dir).expanduser().resolve().as_posix()
|
| old_pythonpath = sys.path.copy()
|
| sys.path.insert(0, new_dir)
|
| os.chdir(new_dir)
|
| try:
|
| yield
|
| finally:
|
| os.chdir(old_dir)
|
| sys.path = old_pythonpath
|
|
|