This commit is contained in:
+31
-3
@@ -1,5 +1,6 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
import os
|
||||
from pathlib import Path
|
||||
import shutil
|
||||
@@ -25,6 +26,10 @@ def resource_path(*parts: str) -> Path:
|
||||
def main() -> None:
|
||||
try:
|
||||
_chdir_to_app_dir()
|
||||
backend_port = _backend_port_from_args()
|
||||
if backend_port is not None:
|
||||
_run_server(backend_port)
|
||||
return
|
||||
_log("TraderAI desktop starting")
|
||||
_log(f"cwd={Path.cwd()}")
|
||||
_log(f"executable={sys.executable}")
|
||||
@@ -36,9 +41,13 @@ def main() -> None:
|
||||
_log("existing TraderAI backend found; opening window")
|
||||
_open_window(url)
|
||||
return
|
||||
server_thread = threading.Thread(target=_run_server, args=(port,), daemon=True)
|
||||
server_thread.start()
|
||||
_log("backend thread started")
|
||||
if getattr(sys, "frozen", False):
|
||||
backend_process = _start_backend_process(port)
|
||||
_log(f"backend process started pid={backend_process.pid}")
|
||||
else:
|
||||
server_thread = threading.Thread(target=_run_server, args=(port,), daemon=True)
|
||||
server_thread.start()
|
||||
_log("backend thread started")
|
||||
_wait_for_server(url)
|
||||
_log("backend health check passed")
|
||||
_open_window(url)
|
||||
@@ -62,6 +71,22 @@ def _select_port() -> int:
|
||||
return _free_port()
|
||||
|
||||
|
||||
def _backend_port_from_args() -> int | None:
|
||||
args = sys.argv[1:]
|
||||
if len(args) >= 2 and args[0] == "--backend-port":
|
||||
return int(args[1])
|
||||
return None
|
||||
|
||||
|
||||
def _start_backend_process(port: int) -> subprocess.Popen:
|
||||
command = [sys.executable, "--backend-port", str(port)]
|
||||
_log(f"starting backend subprocess: {' '.join(command)}")
|
||||
kwargs: dict[str, object] = {}
|
||||
if sys.platform == "win32":
|
||||
kwargs["creationflags"] = subprocess.CREATE_NO_WINDOW
|
||||
return subprocess.Popen(command, **kwargs)
|
||||
|
||||
|
||||
def _port_available(port: int) -> bool:
|
||||
try:
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
||||
@@ -88,6 +113,9 @@ def _existing_server_ready(url: str) -> bool:
|
||||
def _run_server(port: int) -> NoReturn:
|
||||
try:
|
||||
_log(f"backend starting on port {port}")
|
||||
if sys.platform == "win32" and hasattr(asyncio, "WindowsProactorEventLoopPolicy"):
|
||||
asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
|
||||
_log("set Windows Proactor event loop policy for subprocess-compatible backend")
|
||||
from traderai.server import app
|
||||
|
||||
config = uvicorn.Config(
|
||||
|
||||
Reference in New Issue
Block a user