69 lines
2.2 KiB
Python
69 lines
2.2 KiB
Python
from __future__ import annotations
|
|
|
|
import importlib.machinery
|
|
import importlib.util
|
|
import sys
|
|
import types
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
BASE_DIR = Path(__file__).resolve().parent
|
|
PYCACHE_DIR = BASE_DIR / "__pycache__"
|
|
LEGACY_PYC_DIR = BASE_DIR / "_legacy_pyc"
|
|
SUPPORTED_PYTHON = (3, 11)
|
|
|
|
_LEGACY_MODULE: Any | None = None
|
|
|
|
|
|
def _ensure_supported_runtime() -> None:
|
|
if sys.version_info[:2] != SUPPORTED_PYTHON:
|
|
version = ".".join(map(str, sys.version_info[:3]))
|
|
required = ".".join(map(str, SUPPORTED_PYTHON))
|
|
raise RuntimeError(
|
|
f"Legacy collector bytecode requires Python {required}. Current runtime: {version}."
|
|
)
|
|
|
|
|
|
def _ensure_package() -> None:
|
|
package = sys.modules.get("app")
|
|
if package is None:
|
|
package = types.ModuleType("app")
|
|
package.__path__ = [str(BASE_DIR)]
|
|
sys.modules["app"] = package
|
|
|
|
|
|
def _load_sourceless_module(module_name: str, pyc_path: Path) -> Any:
|
|
loader = importlib.machinery.SourcelessFileLoader(module_name, str(pyc_path))
|
|
spec = importlib.util.spec_from_loader(module_name, loader)
|
|
if spec is None:
|
|
raise RuntimeError(f"Unable to create spec for {module_name}")
|
|
module = importlib.util.module_from_spec(spec)
|
|
sys.modules[module_name] = module
|
|
loader.exec_module(module)
|
|
return module
|
|
|
|
|
|
def load_legacy_main() -> Any:
|
|
global _LEGACY_MODULE
|
|
if _LEGACY_MODULE is not None:
|
|
return _LEGACY_MODULE
|
|
|
|
_ensure_supported_runtime()
|
|
_ensure_package()
|
|
|
|
for name in ("database", "fastgpt", "openai_compat"):
|
|
full_name = f"app.{name}"
|
|
if full_name not in sys.modules:
|
|
pyc_dir = LEGACY_PYC_DIR if (LEGACY_PYC_DIR / f"{name}.cpython-311.pyc").exists() else PYCACHE_DIR
|
|
_load_sourceless_module(full_name, pyc_dir / f"{name}.cpython-311.pyc")
|
|
|
|
legacy_name = "app.main_legacy"
|
|
if legacy_name in sys.modules:
|
|
_LEGACY_MODULE = sys.modules[legacy_name]
|
|
return _LEGACY_MODULE
|
|
|
|
main_pyc_dir = LEGACY_PYC_DIR if (LEGACY_PYC_DIR / "main.cpython-311.pyc").exists() else PYCACHE_DIR
|
|
_LEGACY_MODULE = _load_sourceless_module(legacy_name, main_pyc_dir / "main.cpython-311.pyc")
|
|
_LEGACY_MODULE.__package__ = "app"
|
|
return _LEGACY_MODULE
|