Po přenesení jednoho python programu z linuxu pod windows jsem zjistil divné chování příkazu print.
Aby se mi ve výstupech z programů (kdy se spojuje stout a stderr) nemíchalo
pořadí informací, zvykl jsem si nastavit python pomocí -u aby nebufferoval výstupy.
Když tento program spustím ve windows příkazové řádce
nedočkám správného konce výstupu - slova "konec":
#!/usr/bin/python3 -u
TXT = ""
for I in range(2000):
TXT += f"{I:09d}\n"
TXT += "konec"
print(TXT)
Výstup skončí cca u hodnoty 1000.
Pokud na 1. řádku odstraním -u, začne se program
chovat správně, poslední slovo je 'konec'.
Popisované chování je stejné i když je na prvním řádku správnější:
#!python3 -u
Děje se tak jen pokud jde výstup přímo do terminálu a je nastaven zákaz bufferovaní.
Pokud jde výstup do souboru, nebo pokud odstraním '-u', funguje to správně.
Řešením asi bude vypínat bufferování až v programu, v závislosti na platformě:
if os.name == "posix":
import io
sys.stdout = io.TextIOWrapper(open(sys.stdout.fileno(), 'wb', 0), write_through=True)
sys.stderr = io.TextIOWrapper(open(sys.stderr.fileno(), 'wb', 0), write_through=True)