-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrun_defipilot.py
More file actions
120 lines (103 loc) · 3.56 KB
/
run_defipilot.py
File metadata and controls
120 lines (103 loc) · 3.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#!/usr/bin/env python3
"""
run_defipilot.py — lance le journal_daemon + le dashboard GUI.
Usage typique :
python run_defipilot.py --pools data/pools_sample.json --interval 30
Options :
--pools : fichier JSON des stats de pools (liste de dicts) [OBLIGATOIRE]
--cfg : fichier JSON de config (optionnel)
--interval : intervalle entre deux écritures (secondes, défaut 30)
--max-loops : nombre max d’itérations pour le daemon (0 = infini)
--journal : chemin du journal JSONL (défaut: journal_signaux.jsonl)
"""
from __future__ import annotations
import argparse
import os
import subprocess
import sys
import time
from pathlib import Path
def main(argv: list[str] | None = None) -> int:
parser = argparse.ArgumentParser(description="DeFiPilot — Lanceur complet (daemon + dashboard)")
parser.add_argument(
"--pools",
required=True,
help="Fichier JSON des stats de pools (liste de dicts)",
)
parser.add_argument(
"--cfg",
default=None,
help="Fichier JSON de configuration (optionnel)",
)
parser.add_argument(
"--interval",
type=int,
default=30,
help="Intervalle en secondes entre deux écritures par le daemon (défaut: 30)",
)
parser.add_argument(
"--max-loops",
type=int,
default=0,
help="Nombre max d’itérations pour le daemon (0 = infini)",
)
parser.add_argument(
"--journal",
default="journal_signaux.jsonl",
help="Chemin du journal JSONL (défaut: journal_signaux.jsonl)",
)
args = parser.parse_args(argv)
root_dir = Path(__file__).resolve().parent
journal_path = (root_dir / args.journal).resolve()
pools_path = (root_dir / args.pools).resolve()
cfg_path = (root_dir / args.cfg).resolve() if args.cfg else None
# On s'assure que le GUI lira le même fichier JSONL
os.environ["DEFIPILOT_JOURNAL"] = str(journal_path)
# Commande pour lancer le daemon
daemon_cmd = [
sys.executable,
str(root_dir / "journal_daemon.py"),
"--pools",
str(pools_path),
"--interval",
str(args.interval),
"--journal",
str(journal_path),
"--max-loops",
str(args.max_loops),
]
if cfg_path is not None:
daemon_cmd.extend(["--cfg", str(cfg_path)])
print("========================================")
print(" DeFiPilot — Lancement global")
print("========================================")
print(f"Daemon : {daemon_cmd}")
print(f"Journal : {journal_path}")
print(f"GUI : gui/main_window.py")
print("========================================")
# Lancement du daemon en arrière-plan
try:
daemon_proc = subprocess.Popen(daemon_cmd)
except Exception as exc:
print(f"[ERROR] Impossible de lancer journal_daemon.py : {exc}")
return 1
# Petite pause pour laisser le daemon créer le JSONL si besoin
time.sleep(1.0)
# Lancement du dashboard GUI (dans le même processus)
try:
from gui.main_window import MainWindow # type: ignore
app = MainWindow()
app.mainloop()
except KeyboardInterrupt:
print("[INFO] Arrêt demandé par l'utilisateur (Ctrl+C).")
finally:
# On essaie d'arrêter proprement le daemon
if daemon_proc.poll() is None:
print("[INFO] Arrêt du daemon…")
try:
daemon_proc.terminate()
except Exception:
pass
return 0
if __name__ == "__main__":
raise SystemExit(main())