Flask pod pěkně naformátovanou úvodní hlášku vysypal červené varování, že tohle není produkční server. Waitress je čistě pythonní, takže ho PyInstaller zabalí bez řečí, a osm vláken pobere telefony u stolu i tabuli, která se doptává každé dvě vteřiny. Cestou se ukázalo, že hláška se nikdy nedostala do přesměrovaného výstupu: mimo konzoli drží Python výstup v bloku a pouští ho, až program skončí — jenže server neskončí. Zkouška binárky u Gitey si logovala do souboru a pak ho vypisovala, takže celou dobu tiskla prázdno. Řeší to řádkové bufferování v console.utf8(), kam to patří vedle té kódové stránky.
28 lines
1.3 KiB
Python
28 lines
1.3 KiB
Python
"""Aby výstup prošel i tam, kde ho nikdo nečeká na konzoli."""
|
|
|
|
import sys
|
|
|
|
|
|
def utf8() -> None:
|
|
"""Přepne standardní výstup na UTF-8 a na řádkové bufferování.
|
|
|
|
Windows sahá po historické kódové stránce (cp1252, cp852) všude, kde
|
|
výstup není konzole — přesměrovaný do souboru, puštěný ze skriptu, ve
|
|
frontě CI. První háček nad takovým proudem shodí celý program, takže
|
|
binárka umřela dřív, než stihla vypsat adresu, na které poslouchá.
|
|
|
|
Na konzoli i na ostatních systémech je UTF-8 dávno výchozí a tohle je
|
|
tam prázdná operace. `errors="replace"` je pojistka pro zbylé případy:
|
|
rozsypaný háček je pořád lepší než spadlý server.
|
|
|
|
Řádkové bufferování řeší druhou půlku téhož problému. Mimo konzoli
|
|
Python drží výstup v bloku a pouští ho, až se naplní nebo až program
|
|
skončí — jenže server neskončí, ten běží. Kdo si ho pustí na pozadí
|
|
s výpisem do souboru, našel by tam prázdno; přesně to dělá zkouška
|
|
binárky v CI. Pár řádek hlášky za to bufferovat nemá cenu.
|
|
"""
|
|
for stream in (sys.stdout, sys.stderr):
|
|
if hasattr(stream, "reconfigure"):
|
|
stream.reconfigure(encoding="utf-8", errors="replace",
|
|
line_buffering=True)
|