Comfy-Org / Comfy-Org/ComfyUI

API + Custom nodes that use `print` currently broken?

Open
#11,367 0 comments 0 reactions 0 assignees View on GitHub
Potential Bug
Dominant language
Python
Stars
133k
Forks
15.7k
Avg merge
1d 6h
Merged PRs (30d)
155

Description

NOTES:
* Using ComfyUI Electron App

Other details:

OS: Windows 11
ComfyUI v0.4.0
ComfyUI_frontend v1.33.14
Discord
ComfyOrg
ComfyUI_desktop v0.6.0
EasyUse v1.3.3
LoRA Manager v0.9.10-stable
LoRA-Manager
rgthree-comfy v1.0.2508241658

### Custom Node Testing

- [ ] I have tried disabling custom nodes and the issue persists (see [how to disable custom nodes](https://docs.comfy.org/troubleshooting/custom-node-issues#step-1%3A-test-with-all-custom-nodes-disabled) if you need help)

### Expected Behavior

Expected any custom node using `print` (for example, ShowText from comfyui-custom-scripts) to work even when submitted via the API

### Actual Behavior

Node's using `print` do not work via API, but work via the UI. Have tried with three other custom nodes that use `print`, they also fail via the API but work via the UI.

### Steps to Reproduce

I recently noticed that when submitting jobs via the API, I keep getting `OSError: Errno 22] Invalid argument`

After removing problematic nodes incrementally, I realized that the common trend between all the nodes that were raising this error was the use of a `print` statement.

Here's a really simple workflow that reproduces this error

[Show Text Example Workflow.json](https://github.com/user-attachments/files/24206798/Example.of.Show.Text.json)

And the shell script to execute it via API:

```
#!/bin/bash

COMFYUI_URL=
WORKFLOW_FILE=$1

echo "Testing ShowText workflow: $WORKFLOW_FILE"
echo ""

python3 - "$COMFYUI_URL" "$WORKFLOW_FILE" << 'EOF'
import json
import sys
import requests
import time

comfyui_url = sys.argv[1]
workflow_file = sys.argv[2]

# Load workflow
with open(workflow_file, 'r') as f:
workflow = json.load(f)

# Override the string value in node "2" (easy string node)
workflow["2"]["inputs"]["value"] = "Hello from script!"

print("Submitting workflow...")
response = requests.post(f"{comfyui_url}/prompt", json={"prompt": workflow}, timeout=10)

if response.status_code != 200:
print(f"ERROR: {response.status_code}")
print(response.text)
sys.exit(1)

result = response.json()
prompt_id = result.get('prompt_id')
print(f"Submitted. Prompt ID: {prompt_id}")

# Poll for completion
print("Waiting for completion...")
while True:
time.sleep(2)

# Check status
status_response = requests.get(f"{comfyui_url}/prompt/{prompt_id}", timeout=10)
if status_response.status_code == 200:
status = status_response.json()
print(f"\nStatus response: {json.dumps(status, indent=2)}")

# Check for error in status
if status.get('status', {}).get('status_str') == 'error':
print("\n❌ STATUS ERROR DETECTED")
for msg in status.get('status', {}).get('messages', []):
if msg[0] == 'execution_error':
print(f"\nError details: {json.dumps(msg[1], indent=2)}")
sys.exit(1)

# Check history
history = requests.get(f"{comfyui_url}/history/{prompt_id}", timeout=10).json()
print(f"\nHistory response: {json.dumps(history, indent=2)}")

if prompt_id in history:
prompt_data = history[prompt_id]

# Check for error in status within history
if 'status' in prompt_data:
status = prompt_data['status']
if status.get('status_str') == 'error':
print("\n❌ EXECUTION ERROR IN HISTORY:")
for msg in status.get('messages', []):
if msg[0] == 'execution_error':
print(f"\nError details: {json.dumps(msg[1], indent=2)}")
sys.exit(1)

# Check for top-level execution_error
if 'execution_error' in prompt_data:
print("\n❌ EXECUTION ERROR:")
print(json.dumps(prompt_data['execution_error'], indent=2))
sys.exit(1)
else:
print("✓ Completed successfully")
sys.exit(0)
EOF
```

[Example of Show Text.json](https://github.com/user-attachments/files/24206871/Example.of.Show.Text.json)

### Debug Logs

```powershell
Running it:

`./test_showtext.sh "Example of Show Text.json"`

Error that I'm seeing:

Testing ShowText workflow: Example of Show Text.json

Submitting workflow...
Submitted. Prompt ID: 425f64ed-293e-4f89-a1f2-2339dbbc7aab
Waiting for completion...

History response: {
"425f64ed-293e-4f89-a1f2-2339dbbc7aab": {
"prompt": [
136,
"425f64ed-293e-4f89-a1f2-2339dbbc7aab",
{
"1": {
"inputs": {
"text_0": "foo",
"text": [
"2",
0
]
},
"class_type": "ShowText|pysssss",
"_meta": {
"title": "Show Text \ud83d\udc0d"
}
},
"2": {
"inputs": {
"value": "Hello from script!"
},
"class_type": "easy string",
"_meta": {
"title": "String"
}
}
},
{
"create_time": 1765954972625
},
[
"1"
]
],
"outputs": {},
"status": {
"status_str": "error",
"completed": false,
"messages": [
[
"execution_start",
{
"prompt_id": "425f64ed-293e-4f89-a1f2-2339dbbc7aab",
"timestamp": 1765954972626
}
],
[
"execution_cached",
{
"nodes": [
"2"
],
"prompt_id": "425f64ed-293e-4f89-a1f2-2339dbbc7aab",
"timestamp": 1765954972626
}
],
[
"execution_error",
{
"prompt_id": "425f64ed-293e-4f89-a1f2-2339dbbc7aab",
"node_id": "1",
"node_type": "ShowText|pysssss",
"executed": [],
"exception_message": "[Errno 22] Invalid argument\n",
"exception_type": "OSError",
"traceback": [
" File \"C:\\Users\\olive\\AppData\\Local\\Programs\\@comfyorgcomfyui-electron\\resources\\ComfyUI\\execution.py\", line 515, in execute\n output_data, output_ui, has_subgraph, has_pending_tasks = await get_output_data(prompt_id, unique_id, obj, input_data_all, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, v3_data=v3_data)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"C:\\Users\\olive\\AppData\\Local\\Programs\\@comfyorgcomfyui-electron\\resources\\ComfyUI\\execution.py\", line 329, in get_output_data\n return_values = await _async_map_node_over_list(prompt_id, unique_id, obj, input_data_all, obj.FUNCTION, allow_interrupt=True, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, v3_data=v3_data)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\custom_nodes\\comfyui-lora-manager\\py\\metadata_collector\\metadata_hook.py\", line 165, in async_map_node_over_list_with_metadata\n results = await original_map_node_over_list(\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"C:\\Users\\olive\\AppData\\Local\\Programs\\@comfyorgcomfyui-electron\\resources\\ComfyUI\\execution.py\", line 297, in _async_map_node_over_list\n await process_inputs(input_data_all, 0, input_is_list=input_is_list)\n",
" File \"C:\\Users\\olive\\AppData\\Local\\Programs\\@comfyorgcomfyui-electron\\resources\\ComfyUI\\execution.py\", line 291, in process_inputs\n result = f(**inputs)\n ^^^^^^^^^^^\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\custom_nodes\\comfyui-custom-scripts\\py\\show_text.py\", line 30, in notify\n print(\"Error: extra_pnginfo[0] is not a dict or missing 'workflow' key\")\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\colorama\\ansitowin32.py\", line 47, in write\n self.__convertor.write(text)\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\colorama\\ansitowin32.py\", line 177, in write\n self.write_and_convert(text)\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\colorama\\ansitowin32.py\", line 205, in write_and_convert\n self.write_plain_text(text, cursor, len(text))\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\colorama\\ansitowin32.py\", line 210, in write_plain_text\n self.wrapped.write(text[start:end])\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\colorama\\ansitowin32.py\", line 47, in write\n self.__convertor.write(text)\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\colorama\\ansitowin32.py\", line 177, in write\n self.write_and_convert(text)\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\colorama\\ansitowin32.py\", line 205, in write_and_convert\n self.write_plain_text(text, cursor, len(text))\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\colorama\\ansitowin32.py\", line 210, in write_plain_text\n self.wrapped.write(text[start:end])\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\comfyui_manager\\prestartup_script.py\", line 324, in write\n self.sync_write(message)\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\comfyui_manager\\prestartup_script.py\", line 345, in sync_write\n original_stdout.flush()\n",
" File \"C:\\Users\\olive\\AppData\\Local\\Programs\\@comfyorgcomfyui-electron\\resources\\ComfyUI\\app\\logger.py\", line 35, in flush\n super().flush()\n"
],
"current_inputs": {
"text": [
"Hello from script!"
],
"unique_id": [
"1"
],
"extra_pnginfo": [
null
]
},
"current_outputs": [
"1",
"2"
],
"timestamp": 1765954972628
}
]
]
},
"meta": {}
}
}

❌ EXECUTION ERROR IN HISTORY:

Error details: {
"prompt_id": "425f64ed-293e-4f89-a1f2-2339dbbc7aab",
"node_id": "1",
"node_type": "ShowText|pysssss",
"executed": [],
"exception_message": "[Errno 22] Invalid argument\n",
"exception_type": "OSError",
"traceback": [
" File \"C:\\Users\\olive\\AppData\\Local\\Programs\\@comfyorgcomfyui-electron\\resources\\ComfyUI\\execution.py\", line 515, in execute\n output_data, output_ui, has_subgraph, has_pending_tasks = await get_output_data(prompt_id, unique_id, obj, input_data_all, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, v3_data=v3_data)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"C:\\Users\\olive\\AppData\\Local\\Programs\\@comfyorgcomfyui-electron\\resources\\ComfyUI\\execution.py\", line 329, in get_output_data\n return_values = await _async_map_node_over_list(prompt_id, unique_id, obj, input_data_all, obj.FUNCTION, allow_interrupt=True, execution_block_cb=execution_block_cb, pre_execute_cb=pre_execute_cb, v3_data=v3_data)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\custom_nodes\\comfyui-lora-manager\\py\\metadata_collector\\metadata_hook.py\", line 165, in async_map_node_over_list_with_metadata\n results = await original_map_node_over_list(\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n",
" File \"C:\\Users\\olive\\AppData\\Local\\Programs\\@comfyorgcomfyui-electron\\resources\\ComfyUI\\execution.py\", line 297, in _async_map_node_over_list\n await process_inputs(input_data_all, 0, input_is_list=input_is_list)\n",
" File \"C:\\Users\\olive\\AppData\\Local\\Programs\\@comfyorgcomfyui-electron\\resources\\ComfyUI\\execution.py\", line 291, in process_inputs\n result = f(**inputs)\n ^^^^^^^^^^^\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\custom_nodes\\comfyui-custom-scripts\\py\\show_text.py\", line 30, in notify\n print(\"Error: extra_pnginfo[0] is not a dict or missing 'workflow' key\")\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\colorama\\ansitowin32.py\", line 47, in write\n self.__convertor.write(text)\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\colorama\\ansitowin32.py\", line 177, in write\n self.write_and_convert(text)\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\colorama\\ansitowin32.py\", line 205, in write_and_convert\n self.write_plain_text(text, cursor, len(text))\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\colorama\\ansitowin32.py\", line 210, in write_plain_text\n self.wrapped.write(text[start:end])\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\colorama\\ansitowin32.py\", line 47, in write\n self.__convertor.write(text)\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\colorama\\ansitowin32.py\", line 177, in write\n self.write_and_convert(text)\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\colorama\\ansitowin32.py\", line 205, in write_and_convert\n self.write_plain_text(text, cursor, len(text))\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\colorama\\ansitowin32.py\", line 210, in write_plain_text\n self.wrapped.write(text[start:end])\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\comfyui_manager\\prestartup_script.py\", line 324, in write\n self.sync_write(message)\n",
" File \"C:\\Users\\olive\\workspace\\ComfyUI\\.venv\\Lib\\site-packages\\comfyui_manager\\prestartup_script.py\", line 345, in sync_write\n original_stdout.flush()\n",
" File \"C:\\Users\\olive\\AppData\\Local\\Programs\\@comfyorgcomfyui-electron\\resources\\ComfyUI\\app\\logger.py\", line 35, in flush\n super().flush()\n"
],
```

### Other

_No response_

Contributor guide

Open the contributing guide

Research direction

Start by running the supplied API shell script with the linked Show Text workflow and compare it with UI execution. Trace the reported path through execution.py, custom_nodes/comfyui-custom-scripts/py/show_text.py, colorama, comfyui_manager/prestartup_script.py, and app/logger.py. Done means the workflow completes through the API without the reported OSError.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
api, backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.