|
|
|
|
|
""" |
|
|
Development script for auto-reloading the Gradio app when files change. |
|
|
""" |
|
|
|
|
|
import sys |
|
|
import subprocess |
|
|
import time |
|
|
import os |
|
|
from pathlib import Path |
|
|
from watchdog.observers import Observer |
|
|
from watchdog.events import FileSystemEventHandler |
|
|
|
|
|
class ReloadHandler(FileSystemEventHandler): |
|
|
def __init__(self, command): |
|
|
self.command = command |
|
|
self.process = None |
|
|
self.restart() |
|
|
|
|
|
def on_modified(self, event): |
|
|
if event.is_directory: |
|
|
return |
|
|
|
|
|
|
|
|
if event.src_path.endswith(('.py', '.md', '.toml')): |
|
|
print(f"Detected change in {event.src_path}") |
|
|
self.restart() |
|
|
|
|
|
def restart(self): |
|
|
|
|
|
if self.process: |
|
|
print("Terminating existing process...") |
|
|
self.process.terminate() |
|
|
try: |
|
|
self.process.wait(timeout=5) |
|
|
except subprocess.TimeoutExpired: |
|
|
self.process.kill() |
|
|
|
|
|
|
|
|
print("Starting Gradio app...") |
|
|
self.process = subprocess.Popen(self.command, shell=True) |
|
|
|
|
|
def main(): |
|
|
|
|
|
script_dir = Path(__file__).parent.absolute() |
|
|
|
|
|
|
|
|
command = "uv run python app.py" |
|
|
|
|
|
|
|
|
event_handler = ReloadHandler(command) |
|
|
observer = Observer() |
|
|
observer.schedule(event_handler, script_dir, recursive=True) |
|
|
|
|
|
print("Watching for file changes...") |
|
|
print("Press Ctrl+C to stop.") |
|
|
|
|
|
|
|
|
observer.start() |
|
|
|
|
|
try: |
|
|
while True: |
|
|
time.sleep(1) |
|
|
except KeyboardInterrupt: |
|
|
print("\nStopping...") |
|
|
observer.stop() |
|
|
if event_handler.process: |
|
|
event_handler.process.terminate() |
|
|
try: |
|
|
event_handler.process.wait(timeout=5) |
|
|
except subprocess.TimeoutExpired: |
|
|
event_handler.process.kill() |
|
|
|
|
|
observer.join() |
|
|
|
|
|
if __name__ == "__main__": |
|
|
main() |