moving without backward compatibility, since it's extremely unlikely they are used for any external modules in fact, unclear if these methods still have much value at all, but keeping for now just in case
37 lines
1 KiB
Python
37 lines
1 KiB
Python
import importlib
|
|
import importlib.util
|
|
from pathlib import Path
|
|
import sys
|
|
from typing import Optional
|
|
from types import ModuleType
|
|
|
|
from ..common import PathIsh
|
|
|
|
|
|
# TODO only used in tests? not sure if useful at all.
|
|
def import_file(p: PathIsh, name: Optional[str] = None) -> ModuleType:
|
|
p = Path(p)
|
|
if name is None:
|
|
name = p.stem
|
|
spec = importlib.util.spec_from_file_location(name, p)
|
|
assert spec is not None, f"Fatal error; Could not create module spec from {name} {p}"
|
|
foo = importlib.util.module_from_spec(spec)
|
|
loader = spec.loader; assert loader is not None
|
|
loader.exec_module(foo)
|
|
return foo
|
|
|
|
|
|
def import_from(path: PathIsh, name: str) -> ModuleType:
|
|
path = str(path)
|
|
sys.path.append(path)
|
|
try:
|
|
return importlib.import_module(name)
|
|
finally:
|
|
sys.path.remove(path)
|
|
|
|
|
|
def import_dir(path: PathIsh, extra: str = '') -> ModuleType:
|
|
p = Path(path)
|
|
if p.parts[0] == '~':
|
|
p = p.expanduser() # TODO eh. not sure about this..
|
|
return import_from(p.parent, p.name + extra)
|