technova-api / app /main.py
SteGONZALEZ's picture
modifcation commentaires
3207010
Raw
History Blame Contribute Delete
1.77 kB
import subprocess
import sys
import time
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
# Lancement de l'API FastAPI et du dashboard Streamlit en parallèle, avec gestion de l'arrêt propre
def run_api():
return subprocess.Popen(
[
sys.executable, "-m", "uvicorn",
"app.api:app",
"--host", "127.0.0.1",
"--port", "8000",
],
cwd=ROOT,
)
# Lancement du dashboard Streamlit, qui est un client HTTP de l'API (il envoie des requêtes,
# il n'a pas besoin de lancer l'API lui-même)
def run_dashboard():
return subprocess.Popen(
[
sys.executable, "-m", "streamlit",
"run", str(ROOT / "dashboard" / "dshbd.py"),
"--server.port", "8501",
],
cwd=ROOT,
)
# Le dashboard est un client HTTP, il envoie des requêtes à l'API,
# mais il n'a pas besoin de lancer l'API lui-même.
def main():
api = run_api()
dashboard = run_dashboard()
print("API: http://127.0.0.1:8000/docs")
print("Dashboard: http://127.0.0.1:8501")
try:
while True:
api_code = api.poll()
dash_code = dashboard.poll()
if api_code is not None:
print(f"\nAPI stopped (code={api_code}). Stopping dashboard...")
dashboard.terminate()
break
if dash_code is not None:
print(f"\nDashboard stopped (code={dash_code}). Stopping API...")
api.terminate()
break
time.sleep(0.3)
except KeyboardInterrupt:
print("\nSTOP: arrêt demandé, fermeture propre...")
api.terminate()
dashboard.terminate()
if __name__ == "__main__":
main()