Source code for tradeexecutor.utils.python_module_loader

"""Python module loading helpers."""

import importlib
import os.path
import sys
import types
from pathlib import Path


[docs]def import_python_source_file(fname: Path) -> types.ModuleType: """Import a Python source file and return the loaded module. `See the original StackOverflow answer <https://stackoverflow.com/a/41595552/315168>`_. :param fname: The full path to the source file. It may container characters like `.` or `-`. :return: The imported module :raise: ImportError: If the file cannot be imported (e.g, if it's not a `.py` file or if it does not exist). Exception: Any exception that is raised while executing the module (e.g., :exc:`SyntaxError). These are errors made by the author of the module! """ modname = os.path.basename(fname) # https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly spec = importlib.util.spec_from_file_location(modname, fname) if spec is None: raise ImportError(f"Could not load spec for module '{modname}' at: {fname}") module = importlib.util.module_from_spec(spec) sys.modules[modname] = module try: spec.loader.exec_module(module) except FileNotFoundError as e: raise ImportError(f"{e.strerror}: {fname}") from e return module
[docs]def extract_module_members(module: types.ModuleType) -> dict: """Get all variables in a module. See https://stackoverflow.com/a/5103466/315168 """ return module.__dict__.copy()