44 lines
1.3 KiB
Python
44 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
import importlib.util
|
|
import pathlib
|
|
import sys
|
|
from types import ModuleType
|
|
|
|
|
|
def _load_native() -> ModuleType:
|
|
package_dir = pathlib.Path(__file__).resolve().parent
|
|
project_root = package_dir.parent
|
|
|
|
# Common library locations for local cargo builds and wheel installs.
|
|
candidates = [
|
|
project_root / "target" / "debug" / "libslingshot_microservice.so",
|
|
project_root / "target" / "release" / "libslingshot_microservice.so",
|
|
]
|
|
candidates.extend(package_dir.glob("_native*.so"))
|
|
candidates.extend(package_dir.glob("libslingshot_microservice*.so"))
|
|
|
|
module_name = "slingshot_microservice._native"
|
|
for candidate in candidates:
|
|
if not candidate.exists():
|
|
continue
|
|
|
|
spec = importlib.util.spec_from_file_location(module_name, candidate)
|
|
if spec is None or spec.loader is None:
|
|
continue
|
|
|
|
module = importlib.util.module_from_spec(spec)
|
|
sys.modules[module_name] = module
|
|
spec.loader.exec_module(module)
|
|
return module
|
|
|
|
raise ModuleNotFoundError(
|
|
"Native extension is not built. Build it with: cargo build --features python"
|
|
)
|
|
|
|
|
|
_native = _load_native()
|
|
Microservice = _native.Microservice
|
|
|
|
__all__ = ["Microservice"]
|