fix(console): write UTF-8 to redirected streams on Windows

This commit is contained in:
imSp4rky
2026-10-02 14:07:05 -06:00
parent 34eb94b55d
commit 73bdb98d3e
2 changed files with 27 additions and 1 deletions
+15 -1
View File
@@ -2,12 +2,16 @@
from __future__ import annotations
import io
import sys
import pytest
from click.testing import CliRunner
from unshackle.core import __version__
from unshackle.core.__main__ import main
from unshackle.core.__main__ import main, print_banner
from unshackle.core.config import config
from unshackle.core.console import force_utf8_streams
@pytest.mark.parametrize("args", [["--help"], ["env", "--help"]])
@@ -19,3 +23,13 @@ def test_help_prints_the_banner_once(monkeypatch: pytest.MonkeyPatch, args: list
assert result.exit_code == 0, result.output
assert result.output.count(f"v {__version__}") == 1
assert "Usage:" in result.output
def test_banner_prints_to_a_legacy_code_page_stream(monkeypatch: pytest.MonkeyPatch) -> None:
buffer = io.BytesIO()
monkeypatch.setattr(sys, "stdout", io.TextIOWrapper(buffer, encoding="cp1252"))
force_utf8_streams()
print_banner()
assert "▄".encode() in buffer.getvalue()
+12
View File
@@ -1,6 +1,9 @@
import codecs
import io
import logging
import math
import shutil
import sys
from datetime import datetime
from types import ModuleType
from typing import IO, Any, Callable, Iterable, List, Literal, Mapping, Optional, TextIO, Union
@@ -402,6 +405,15 @@ class _GradientPulse:
return Measurement(4, self.width or options.max_width)
def force_utf8_streams() -> None:
"""Make stdout and stderr write UTF-8. A redirected stream on Windows uses a legacy code page that cannot encode the console output."""
for stream in (sys.stdout, sys.stderr):
if isinstance(stream, io.TextIOWrapper) and codecs.lookup(stream.encoding).name != "utf-8":
stream.reconfigure(encoding="utf-8", errors="replace")
force_utf8_streams()
console = ComfyConsole(
log_time=False,
log_path=False,