63 lines
1.7 KiB
Python
63 lines
1.7 KiB
Python
|
|
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())
|