#!/usr/bin/env python3 """启动 3D 服务端。 用法: python3 viewer/backend/run.py # 默认 127.0.0.1:5182 python3 viewer/backend/run.py --port 9100 --reload """ import argparse import sys from pathlib import Path BASE_DIR = Path(__file__).resolve().parent sys.path.insert(0, str(BASE_DIR)) def _require_dependencies() -> None: missing = [name for name in ("fastapi", "uvicorn") if _importable(name) is None] if not missing: return req = BASE_DIR / "requirements.txt" sys.stderr.write( "\n[启动失败] 当前 Python 缺少依赖: " + ", ".join(missing) + "\n" f" 当前解释器: {sys.executable}\n" f" 版本: {sys.version.split()[0]}\n" f" 安装依赖: {sys.executable} -m pip install -r {req}\n" "\n提示:如果 `python3` 指向系统解释器(如 /usr/bin/python3),\n" "请先激活项目环境(conda activate compressor-wave),\n" "或用 conda run -n compressor-wave python3 viewer/backend/run.py 运行。\n", ) raise SystemExit(1) def _importable(name: str): try: return __import__(name) except ImportError: return None def main() -> None: _require_dependencies() import uvicorn parser = argparse.ArgumentParser(description="压缩机 3D 部件查看服务") parser.add_argument("--host", default="127.0.0.1") parser.add_argument("--port", type=int, default=5182) parser.add_argument("--reload", action="store_true") args = parser.parse_args() uvicorn.run("main:app", host=args.host, port=args.port, reload=args.reload) if __name__ == "__main__": main()