import os import subprocess import sys from pathlib import Path PROJECT_ROOT = Path(__file__).resolve().parent VENV_ROOT = PROJECT_ROOT / ".venv" VENV_DIR = VENV_ROOT / "Scripts" VENV_PYTHON = VENV_DIR / "python.exe" VENV_PYTHONW = VENV_DIR / "pythonw.exe" def _resolve(path): try: return Path(path).resolve() except Exception: return None def _running_in_project_venv(): current_prefix = _resolve(sys.prefix) if current_prefix == _resolve(VENV_ROOT): return True current_executable = _resolve(sys.executable) allowed_targets = {_resolve(VENV_PYTHON), _resolve(VENV_PYTHONW)} return current_executable in allowed_targets def _pick_reexec_python(): current_name = Path(sys.executable).name.lower() if current_name == "pythonw.exe" and VENV_PYTHONW.exists(): return VENV_PYTHONW if VENV_PYTHON.exists(): return VENV_PYTHON if VENV_PYTHONW.exists(): return VENV_PYTHONW raise RuntimeError(f"未找到项目 .venv 解释器: {VENV_PYTHON}") def ensure_project_venv(): if _running_in_project_venv(): return if os.environ.get("OPENCLAW_PROJECT_VENV_REEXEC") == "1": raise RuntimeError("重启后仍未进入项目 .venv,请检查 .venv 是否损坏或系统 Python 安装是否异常") env = os.environ.copy() env["OPENCLAW_PROJECT_VENV_REEXEC"] = "1" target_python = _pick_reexec_python() subprocess.Popen([str(target_python), str(PROJECT_ROOT / "main.py")], cwd=str(PROJECT_ROOT), env=env) raise SystemExit(0) ensure_project_venv() from PySide6.QtWidgets import QApplication from app.presentation.main_window import MainWindow if __name__ == "__main__": app = QApplication(sys.argv) w = MainWindow() sys.exit(app.exec())