Leiten Sie stdout von Python für C-Aufrufe um

9

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.

Fragen

  1. Was genau passiert in der obigen Funktion?
    • Was macht dup und dup2 ?
    • Was ist /dev/null ?
    • Was macht Zeile 8? ( sys.stdout = os.fdopen(newstdout, 'w') )
  2. Wie kann ich das stdout in einem StringIO Objekt speichern?
  3. Wie kann ich das stdout nach dem Aufruf meines Programms Hello World wiederherstellen?

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.

    
Woltan 10.01.2012, 14:32
quelle

3 Antworten

11

Ich habe unten ein paar zusätzliche Kommentare geschrieben, die deutlicher machen sollten, was in der Funktion redirect_stdout vor sich geht:

%Vor%

Es ist wichtig zu beachten, dass ein Prozess drei verschiedene Dateideskriptoren vom Betriebssystem erhält, wenn er gestartet wird:

>
  • stdin: 0
  • stdout: 1
  • stderr: 2

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.

    
jcollado 10.01.2012, 14:47
quelle
7

/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.

    
snim2 10.01.2012 14:46
quelle
-1

Siehe Manpages für die C-Laufzeitfunktionen, die diesen Python-Funktionen zugrunde liegen.

Im Grunde kopieren sie einen Dateideskriptor entweder in einen neuen Dateideskriptor (mit dup() ) oder in einen im Aufruf angegebenen Dateideskriptor mit dup2() .

    
unwind 10.01.2012 14:40
quelle