Spaces:
Sleeping
Sleeping
""" | |
launch.py | |
Launcher script to run both FastAPI backend and Streamlit frontend. | |
- For local development: Starts both services on different ports | |
- For Hugging Face Spaces: Configured to work with the Spaces proxy | |
""" | |
import os | |
import subprocess | |
import threading | |
import time | |
import signal | |
import sys | |
# Configuration | |
FASTAPI_PORT = 7860 | |
STREAMLIT_PORT = 8501 | |
IS_SPACE = "SPACE_ID" in os.environ # Check if running on Hugging Face Spaces | |
# Define commands to run services | |
if IS_SPACE: | |
# On Hugging Face Spaces, we need to bind to 0.0.0.0 to allow external access | |
fastapi_cmd = ["python", "-m", "uvicorn", "api_backend:app", "--host", "0.0.0.0", "--port", str(FASTAPI_PORT)] | |
streamlit_cmd = ["streamlit", "run", "app.py", "--server.address", "0.0.0.0", "--server.port", str(STREAMLIT_PORT)] | |
else: | |
# For local development | |
fastapi_cmd = ["python", "-m", "uvicorn", "api_backend:app", "--port", str(FASTAPI_PORT)] | |
streamlit_cmd = ["streamlit", "run", "app.py", "--server.port", str(STREAMLIT_PORT)] | |
# Processes to track for cleanup | |
processes = [] | |
# Signal handler for graceful shutdown | |
def handle_shutdown(signum, frame): | |
print("\nShutting down all services...") | |
for process in processes: | |
if process.poll() is None: # Check if process is still running | |
process.terminate() | |
sys.exit(0) | |
# Register signal handlers for graceful shutdown | |
signal.signal(signal.SIGINT, handle_shutdown) | |
signal.signal(signal.SIGTERM, handle_shutdown) | |
def run_service(cmd, service_name): | |
"""Run a service process and capture its output.""" | |
print(f"Starting {service_name}...") | |
process = subprocess.Popen( | |
cmd, | |
stdout=subprocess.PIPE, | |
stderr=subprocess.STDOUT, | |
universal_newlines=True, | |
bufsize=1 | |
) | |
processes.append(process) | |
# Print process output with service identifier | |
for line in process.stdout: | |
print(f"[{service_name}] {line}", end="") | |
# If we get here, the process has ended | |
print(f"{service_name} has stopped.") | |
# Main execution | |
if __name__ == "__main__": | |
print("π Starting Flowchart-to-English services") | |
# Start FastAPI in a separate thread | |
fastapi_thread = threading.Thread( | |
target=run_service, | |
args=(fastapi_cmd, "FastAPI"), | |
daemon=True | |
) | |
fastapi_thread.start() | |
# Give FastAPI a moment to start up | |
time.sleep(2) | |
# Start Streamlit (in the main thread) | |
run_service(streamlit_cmd, "Streamlit") |