Ich habe ein lang laufendes Python-Skript, das regelmäßig Daten an die Standardausgabe ausgibt, die ich mit etwas aufgerufen habe:
python script.py > output.txt
Dieses Skript wurde für eine Weile ausgeführt und ich möchte es mit Ctrl+ stoppen, Caber nichts von seiner Ausgabe verlieren. Leider habe ich bei der Implementierung des Skripts vergessen, den Puffer nach jeder Ausgabezeile mit etwas wie dem zu leeren sys.stdout.flush()
(der zuvor vorgeschlagenen Lösung zum Erzwingen des Löschens der Ausgabe). Wenn ich also jetzt Ctrl+ Caufrufe, verliere ich alle meine Ausgaben.
Wenn Sie sich fragen, ob es eine Möglichkeit gibt, mit einem laufenden Python-Skript (oder allgemeiner mit einem laufenden Prozess) zu interagieren, um es zu zwingen, seinen Ausgabepuffer zu leeren. Ich frage nicht, wie das Skript bearbeitet und erneut ausgeführt werden soll, damit es richtig geleert wird. Bei dieser Frage geht es speziell um die Interaktion mit einem laufenden Prozess (und in meinem Fall darum, die Ausgabe meiner aktuellen Codeausführung nicht zu verlieren).
fileobject.c
) zu haben als 2.7 . Jemand muss sich in dasio
Modul einarbeiten.Es gibt keine Lösung für Ihr unmittelbares Problem. Wenn Ihr Skript bereits gestartet wurde, können Sie den Puffermodus nachträglich nicht mehr ändern. Dies sind alles In-Memory-Puffer, die beim Starten des Skripts, Öffnen von Datei-Handles, Erstellen von Pipes usw. eingerichtet werden.
Im Endeffekt können Sie nur dann einen
sync
Befehl ausführen, wenn die betreffende Pufferung teilweise oder vollständig auf der E / A-Ebene der Ausgabe erfolgt . In einem solchen Fall ist dies jedoch im Allgemeinen unwahrscheinlich.In Zukunft können Sie Pythons
-u
Option * verwenden , um das Skript auszuführen. Im Allgemeinen verfügen viele Befehle über befehlsspezifische Optionen zum Deaktivieren der stdin / stdout-Pufferung, und Sie können auch allgemeine Erfolge mit demunbuffer
Befehl aus demexpect
Paket erzielen .Ein Ctrl+ Cwürde dazu führen, dass Puffer auf Systemebene geleert werden, wenn das Programm unterbrochen wird, es sei denn, die Pufferung wird von Python selbst durchgeführt und es wurde die Logik zum Leeren der eigenen Puffer mit Ctrl+ nicht implementiert C. Ein Suspend, Crash oder Kill wäre nicht so nett.
* Erzwinge, dass stdin, stdout und stderr völlig ungepuffert sind.
quelle
Python 2.7.7-Dokumentation, Abschnitt "Python-Setup und -Verwendung", Unterabschnitt 1. Befehlszeile und Umgebung , beschreibt dieses Python-Argument:
Und auch diese Umgebungsvariable:
quelle
sys.stdout.flush()
, aber Ihre-u
Option scheint noch einfacher zu sein), hatte dies aber nur vergessen, als ich meinen Code aufrief. Nachdem ich meinen Code bereits länger als eine Woche ausgeführt hatte, hoffte ich, dass es eine Möglichkeit gab, meine Ausgabe zu erhalten, ohne den Code für eine weitere Woche erneut ausführen zu müssen.Es scheint, dass ich übervorsichtig war, weil ich nach dem Ausführen von Strg-C durch gepufferte Ausgabe verloren habe. Nach diesem Post sollte ich erwarten, dass der Puffer geleert wird, wenn mein Programm einen normalen Exit hat, was der Fall wäre, wenn ich Strg-C drücke. Andererseits würde ich die gepufferte Ausgabe verlieren, wenn ich das Skript mit SIGKILL oder ähnlichem beenden würde.
quelle
Ich denke, eine andere mögliche Lösung kann darin bestehen, den Prozessabbruch mit entleertem Kern zu erzwingen und dann den Speicherinhalt posthum zu analysieren.
quelle