API + Custom nodes that use `print` currently broken?
- 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
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