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