Dies ist eine Folgefrage von hier speziell zu Antwort .
Von einem Python-Modul aus rufe ich eine Hello World ausführbare Datei auf, die einfach Hello World
an die Standardausgabe ausgibt. Ich bin daran interessiert, diese Ausgabe zu einem Python StringIO
umzuleiten und rannte in diese Antwort, die mich fast den ganzen Weg zu mir bringt die Lösung.
Der kritische Teil dieser Antwort ist dieses Codesegment:
%Vor%Ich möchte auch das stdout wiederherstellen, wie es vor der Umleitung war.
dup
und dup2
? /dev/null
? sys.stdout = os.fdopen(newstdout, 'w')
) StringIO
Objekt speichern? Ich bin mir ziemlich sicher, dass, sobald ich die Antwort für meine Frage 1 habe, die Antworten auf die Fragen 2 und 3 einfach sein werden. Ich entschied mich, sie trotzdem zu veröffentlichen, um vielleicht die Antwort von Frage 1 in die Richtung zu schieben, wohin ich gehen möchte.
Ich habe unten ein paar zusätzliche Kommentare geschrieben, die deutlicher machen sollten, was in der Funktion redirect_stdout
vor sich geht:
Es ist wichtig zu beachten, dass ein Prozess drei verschiedene Dateideskriptoren vom Betriebssystem erhält, wenn er gestartet wird:
>Wie in den Kommentaren erläutert, nutzt der obige Code den Dateideskriptor für stdout und die Dateideskriptor-Duplizierungsfunktionen, um den C-Code dazu zu bringen, ein anderes stdout zu verwenden, während immer noch ein Verweis auf das ursprüngliche stdout im Python-Code verbleibt um drucken zu können.
/dev/null
ist eine spezielle Gerätedatei (alles in UNIX ist eine Datei!), die alles, was darauf geschrieben ist, wie ein schwarzes Loch verschluckt. dup
dupliziert einen Dateideskriptor. Wenn Sie mit Windows vertraut sind, ist ein Dateideskriptor in UNIX eine spezielle Ganzzahl, die eine geöffnete Datei darstellt, wie eine Windows-Dateikennung.
Das Programm öffnet /dev/null
zum Schreiben (nur), nimmt eine Kopie seines Dateideskriptors und schließt die geöffnete Datei (weil ein UNIX-Dateideskriptor genügt, um in eine Datei zu schreiben, müssen Sie nicht Halten Sie die Ressourcen offen) und weisen Sie dann die geöffnete Datei sys.stdout
zu.
Denken Sie daran, dass sys
das Python-Modul ist, das alle Arten von systemspezifischen Ressourcen wie das Dateisystem darstellt. Also wird in UNIX sys.stdout
/dev/stdout
darstellen, d. H. Das System STDOUT
stream.
Also, dieser Code täuscht Python vor, dass /dev/null/
ist STDOUT
, also jetzt jedes Mal, wenn Ihr Programm in STDOUT
schreibt, sagen wir, die print
Anweisung (Funktion in Python3), dann wird es schreibe wirklich in /dev/null
und du wirst den resultierenden Text nie auf deiner Konsole sehen.
Tags und Links python stdout io-redirection dup2 dup