import argparse import asyncio import os import sys from typing import Any import uvicorn # 将项目根目录添加到 python 路径 sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) def build_server_options(argv: list[str] | None = None) -> dict[str, Any]: parser = argparse.ArgumentParser(description="Run the TJWater API server") parser.add_argument("--host", default="0.0.0.0") parser.add_argument("--port", type=int, default=8000) parser.add_argument("--reload", action="store_true") parser.add_argument("--reload-dir", action="append", default=[]) parser.add_argument("--startup-timeout", type=int, default=60) args = parser.parse_args(argv) if args.startup_timeout <= 0: parser.error("--startup-timeout must be positive") return { "app": "app.main:app", "host": args.host, "port": args.port, "reload": args.reload, "reload_dirs": args.reload_dir, "startup_timeout": args.startup_timeout, "loop": "asyncio", } def main() -> None: from pathlib import Path from scripts.server_handoff import HandoffSupervisor options = build_server_options() reload_enabled = options.pop("reload") reload_dirs = options.pop("reload_dirs") startup_timeout = options.pop("startup_timeout") if reload_enabled: HandoffSupervisor( uvicorn.Config(**options), startup_timeout=startup_timeout, reload_dirs=[Path(directory) for directory in reload_dirs] or None, readiness_check="app.api.health:metadata_database_ready", ).run() else: uvicorn.run(**options) if __name__ == "__main__": # Windows 设置事件循环策略 if sys.platform == "win32": asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) main()