Portál AbcLinuxu, 11. května 2025 06:40
Dobry den, mam skript v pythonu, ktery vypisuje v pravidelnych intervalech urcite informace. Vystup skriptu presmeruji do souboru:
./script > output.txt
Soubor se vsak neaktualizuje hned, ale postupne se bufferuje po 4096 bajtech. Ja potrebuji tuto vlastnost vypnout. Vygooglil jsem si parametr -u. Kdyz spustim skript takto:
python -u script > output.txt
Tak pak vse funguje jak ma. Jenze takto ten skript nechci spoustet, proto jsem zkusil neco takoveho pridat na zacatek skriptu:
#!/usr/bin/env python -u
Jenze to pri spusteni rika:
/usr/bin/env: python -u: No such file or directory
Jeste jsem zkousel nastavit promennou PYTHONUNBUFFERED, ale take bezuspesne. Vim, ze mohu po kazde stdout operaci volat flush, ale to se mi nezda jako ciste reseni. Muzete mi prosim poradit?
#!/usr/bin/python -u
Dekuji, toto funguje, jenze ruzne distribuce mohou mit interpret umisteny jinde a pak nastane problem s prenositelnosti skriptu.
Tuším, že v Linuxových distribucích by to neměl být problém, pokud Ti to vadí, tak použij wrapper. Každopádně /usr/bin/env
je sice z balíčku coreutils
, ale mimo Linuxový svět Ti zase nic nezaručí, že env opravdu bude na uvedené cestě. Potom se navíc musí ošetřit spouštění správné verze Pythonu a dostupnost modulů, které skript využívá. Takže /usr/bin/env
oproti /usr/bin/python
si mohou směle podat ruce, protože existují zásadnější problémy.
BTW: Možná Tě bude zajímat diskuze: #!/usr/bin/env python vs. #!/usr/bin/python.
Vycetl jsem z toho dobre, ze na Linuxu to pres env nepujde? Nebo je tam i reseni, ktere jsem prehlidnul?
Případně existují ještě jiná řešení než je argument -u
:
Python output buffering:
# reopen stdout file descriptor with write mode # and 0 as the buffer size (unbuffered) sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.