Možná budete také muset vyrovnávací paměť explicitně vyprázdnit, aby se při generování přenesla do potrubí. Je to proto, že výstup se obvykle tiskne pouze tehdy, když se vyrovnávací paměť roury zaplní (což je podle mého názoru v kilobajtech) a když zpráva stdin skončí. Pravděpodobně jde o úsporu čtení/zápisu. Můžete to udělat po každém tisku, nebo pokud provádíte smyčku, po posledním tisku v rámci smyčky.
import sys
...
print('Some message')
sys.stdout.flush()
Spusťte python s příznakem unbuffered:
python -u myprog.py > output.txt
Výstup se pak vytiskne v reálném čase.
Namísto pokusu o omezení živého souboru použijte tee
namísto. Byla vytvořena, aby dělala přesně to, o co se snažíte.
Od pánského trička:
tee(1) – manuálová stránka systému Linux
Jméno tee - čtení ze standardního vstupu a zápis na standardní výstup a soubory
Souhrn
tee [OPTION]... [FILE]...
Popis
Zkopírujte standardní vstup do každého SOUBORu a také do standardního výstupu.
-a, --append append to the given FILEs, do not overwrite -i, --ignore-interrupts ignore interrupt signals --help display this help and exit --version output version information and exit
Pokud je SOUBOR -, zkopírujte znovu na standardní výstup.
Ve vašem případě byste tedy spustili:
python myprog.py | tee output.txt
EDIT:Jak jiní zdůraznili, tato odpověď narazí na stejný problém, jaký měl OP, pokud není sys.stdout.flush()
se používá v programu python, jak je popsáno v Daveyho přijaté odpovědi. Testování, které jsem provedl před odesláním této odpovědi, přesně neodráželo případ použití OP.
tee
lze stále použít jako alternativní - i když méně než optimální - metodu zobrazení výstupu a zároveň zápisu do souboru, ale Daveyho odpověď je jednoznačně správná a nejlepší odpověď.