
Ich habe ein Programm long_interactive_script.py
mit Tausenden von print
Anweisungen. Ich möchte das Programm weiterleiten tee
(oder eine Alternative verwenden), damit ich die Ausgabe speichern kann.
Wenn ich mache
long_interactive_script.py | tee logfile.txt
Python speichert seine Druckanweisungen in einem 4K-Puffer, wodurch ich Folgendes erhalte:
nichts, nichts, nichts, nichts, eine ganze Menge Text!, nichts, nichts, eine Sudo-Eingabeaufforderung mitten in einem Wort, nichts, nichts, eine ganze Menge Text!
Um den Puffer zu vermeiden, habe ich Folgendes versucht:
unbuffer long_interactive_script.py | tee logfile.txt
Dies führt jedoch dazu, dass mein Skript nicht mehr interaktiv ist. Wenn das Skript also in einesudoEingabeaufforderung, es hält an.
Hinweis: Ich kann nicht einfach sudo
VOR dem Ausführen des Skripts danach fragen. Das interaktive Skript wird nur sudo
bei einigen Ausführungen benötigt und ich möchte nicht danach fragen, sudo
wenn es nicht notwendig ist.
Mehr...
stdbuf -oL long_interactive_script.py | tee -a logfile.txt
funktioniert einigermaßen. Ich erhalte alle gewünschten Daten, aber auch diesen Fehler:
ERROR: ld.so: object '/usr/lib64/coreutils/libstdbuf.so' from LD_PRELOAD cannot be preloaded: ignored.
Antwort1
Geben Sie einen Puffer mit der Größe Null für den Standardausgabestream von Python an. Sie können dies tun, indem Sie Python mit dem -u
Flag oder mit der folgenden Anweisung aufrufen.
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
Antwort2
Ungeachtet der Workarounds zum Puffern verwenden andere deshalbscript
, das alle an das Terminal geschriebenen Zeichen erfasst, ohne interaktive Eingabeaufforderungen zu beeinträchtigen.
Die resultierende typescript
Datei ist etwas hässlicher als eine einfache Umleitung zur Standardausgabe, aber (vorausgesetzt, Ihre Anwendung hat in diesem Modus nützliche Informationen bereitgestellt) reicht es aus, einfach die Wagenrücklaufzeichen zu entfernen.
Neben den Zeilenumbrüchen müssen auch Bearbeitungszeichen herausgefiltert werden. Siehe zum Beispiel: