Echtzeit-Druckanweisungen mit T-Shirt im interaktiven Skript

Echtzeit-Druckanweisungen mit T-Shirt im interaktiven Skript

Ich habe ein Programm long_interactive_script.pymit Tausenden von printAnweisungen. 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 sudoVOR dem Ausführen des Skripts danach fragen. Das interaktive Skript wird nur sudobei einigen Ausführungen benötigt und ich möchte nicht danach fragen, sudowenn 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 -uFlag 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 typescriptDatei 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:

verwandte Informationen