本教程将指导你如何通过 Python 调用 ComfyUI 的 API 接口,实现自动化图像生成。你只需准备一个导出的 API 格式工作流文件,即可通过脚本提交任务、获取结果并保存图片。
--listen 参数)32794)只需要 requests 库:
bashpip install requests
在服务器上执行(IP 和端口根据实际情况修改):
bashcd /path/to/ComfyUI
python main.py --listen 0.0.0.0 --port 32794
注意:
--listen 0.0.0.0允许外部访问,--port指定端口号。
ComfyUI 默认保存的工作流包含界面布局信息,不适合 API 调用。你需要导出纯 API 格式的 JSON 文件。
.json 文件(例如 workflow_api.json)。注意:不要使用普通的 “Save” 按钮,否则后续调用会失败。
下面提供一个通用的脚本模板,只需修改 SERVER_URL 和 WORKFLOW_FILE 即可。
pythonimport json
import time
import random
import requests
from urllib.parse import urljoin
# ========== 配置 ==========
SERVER_URL = "http://<YOUR_SERVER_IP>:8180" # 替换为你的 ComfyUI 服务地址
WORKFLOW_FILE = "workflow_api.json" # 你导出的 API 工作流文件
def queue_prompt(workflow):
"""提交工作流到队列,返回 prompt_id"""
url = urljoin(SERVER_URL, "/prompt")
payload = {"prompt": workflow}
resp = requests.post(url, json=payload)
resp.raise_for_status()
return resp.json()["prompt_id"]
def get_history(prompt_id, max_wait=60):
"""轮询获取生成结果,超时返回 None"""
url = urljoin(SERVER_URL, f"/history/{prompt_id}")
start = time.time()
while time.time() - start < max_wait:
resp = requests.get(url)
if resp.status_code == 200:
data = resp.json()
if prompt_id in data:
return data[prompt_id]
time.sleep(1)
return None
def save_images(history, output_prefix="output"):
"""从 history 中提取图片并保存到本地"""
outputs = history.get("outputs", {})
saved = []
for node_id, node_out in outputs.items():
images = node_out.get("images", [])
for img in images:
filename = img["filename"]
img_url = urljoin(SERVER_URL, f"/view?filename={filename}")
img_data = requests.get(img_url).content
local_name = f"{output_prefix}_{filename}"
with open(local_name, "wb") as f:
f.write(img_data)
print(f"已保存: {local_name}")
saved.append(local_name)
return saved
def main():
# 1. 加载工作流
with open(WORKFLOW_FILE, "r", encoding="utf-8") as f:
workflow = json.load(f)
# 2. (可选)修改工作流参数,例如随机种子、提示词等
# 假设 KSampler 节点的 ID 为 "3"(具体 ID 需查看你的 JSON)
if "3" in workflow and "inputs" in workflow["3"]:
workflow["3"]["inputs"]["seed"] = random.randint(1, 10**9)
print(f"设置随机种子: {workflow['3']['inputs']['seed']}")
# 3. 提交任务
print("正在提交任务...")
prompt_id = queue_prompt(workflow)
print(f"任务 ID: {prompt_id}")
# 4. 等待结果
print("等待生成完成...")
history = get_history(prompt_id)
if not history:
print("超时未获取到结果")
return
# 5. 保存图片
saved = save_images(history)
print(f"完成,共保存 {len(saved)} 张图片")
if __name__ == "__main__":
main()
如果你希望每次运行都输入不同的提示词,可以找到工作流中的 CLIPTextEncode 节点(通常为 class_type: "CLIPTextEncode"),修改其 text 字段。示例:
python# 假设提示词节点 ID 为 "6"
user_prompt = input("请输入提示词: ")
workflow["6"]["inputs"]["text"] = user_prompt
更通用的方法是遍历所有节点,根据 class_type 自动识别:
pythondef set_prompt(workflow, positive_text, negative_text=None):
for node_id, node in workflow.items():
if node.get("class_type") == "CLIPTextEncode":
title = node.get("_meta", {}).get("title", "").lower()
if negative_text and ("negative" in title or "neg" in title):
node["inputs"]["text"] = negative_text
else:
node["inputs"]["text"] = positive_text
KSampler 节点,修改 seed 字段。steps 字段。EmptyLatentImage 或类似节点,修改 width、height。bashpython call_comfyui.py
output_*.png 文件保存在当前目录。如果遇到连接错误,可以在浏览器访问 http://<YOUR_SERVER_IP>:32794,确认 ComfyUI 界面可打开。
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
ConnectionError | 服务器 IP/端口错误,或防火墙未放行 | ping <IP> 测试连通性;检查云安全组是否开放对应端口 |
KeyError: 'prompt_id' | 工作流不是 API 格式 | 重新按第二章导出 API 格式 JSON |
get_history 超时 | 生成时间过长或服务端出错 | 增加 max_wait 参数;查看 ComfyUI 服务端日志 |
403 Forbidden | ComfyUI 未监听 0.0.0.0 | 启动时添加 --listen 0.0.0.0 参数 |
| 图片未生成 | 模型文件缺失或路径错误 | 检查 ComfyUI 控制台错误信息,确认模型文件已正确放置 |
准备一个 prompts.txt 文件,每行一个提示词,然后循环调用:
pythonwith open("prompts.txt", "r", encoding="utf-8") as f:
prompts = [line.strip() for line in f if line.strip()]
for idx, p in enumerate(prompts):
workflow["6"]["inputs"]["text"] = p
workflow["3"]["inputs"]["seed"] = random.randint(1, 10**9)
prompt_id = queue_prompt(workflow)
history = get_history(prompt_id)
if history:
save_images(history, output_prefix=f"batch_{idx}")
可以将上述脚本封装为 Flask API,接收提示词参数,返回生成的图片 URL。示例:
pythonfrom flask import Flask, request, send_file
import io
app = Flask(__name__)
@app.route('/generate', methods=['POST'])
def generate():
prompt = request.json.get('prompt')
# 调用 ComfyUI API 生成图片
# ...
return send_file(io.BytesIO(img_data), mimetype='image/png')
通过本教程,你已经学会了:
这套自动化流程可以无缝集成到你的电商、设计或内容生产系统中,实现从文本到图像的自动化生成。如果在实际操作中遇到问题,请检查 ComfyUI 服务端日志,并根据错误提示调整脚本或工作流。
本文作者:苏皓明
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!