viggle-animate-workflow / scripts /poll_prompt.py
xue
SlimDiT source: conversion library + ComfyUI node pack + workflows + tests
bf2a6c7 verified
Raw History Blame Contribute Delete
1.7 kB
"""Poll a ComfyUI prompt until it finishes, then print status, timing and output files."""
import json
import os
import sys
import time
import urllib.request
PID = sys.argv[1]
BASE = os.environ.get("COMFY_URL", "http://127.0.0.1:8188") # 8188 is ComfyUI's default port
def get(path):
return json.load(urllib.request.urlopen(BASE + path, timeout=30))
t0 = time.time()
last = None
while time.time() - t0 < 1080:
queue = get("/queue")
running, pending = len(queue["queue_running"]), len(queue["queue_pending"])
if (running, pending) != last:
print(f"[{time.time() - t0:4.0f}s] running={running} pending={pending}", flush=True)
last = (running, pending)
if running == 0 and pending == 0 and get("/history/" + PID):
break
time.sleep(10)
history = get("/history/" + PID)
if not history:
print("timeout: prompt never finished")
raise SystemExit(1)
entry = history[PID]
messages = entry["status"]["messages"]
stamps = [m[1]["timestamp"] / 1000 for m in messages if isinstance(m[1], dict) and "timestamp" in m[1]]
if stamps:
print(f"wall clock: {(time.time() - t0) / 60:.1f} min")
print("status:", entry["status"]["status_str"])
for name, payload in messages:
if name in ("execution_error", "execution_interrupted"):
print("error:", json.dumps(payload, ensure_ascii=False)[:500])
files = []
for _node, out in (entry.get("outputs") or {}).items():
for kind, items in out.items():
for item in items if isinstance(items, list) else []:
if isinstance(item, dict) and item.get("filename"):
files.append((kind, item["filename"], round(item.get("size", 0) / 1e6, 1)))
print("outputs:", files)