Ich versuche, die Ausgabe von printf-Funktionen in eine Datei unter Windows umzuleiten. Ich benutze ctypes mit python3, um die Funktionen aufzurufen. Mein Code ist:
%Vor%Aber wenn ich den Code von Eclipse starte, bekomme ich folgendes auf dem Bildschirm:
%Vor%... und das Folgende in der TEST.txt
%Vor%Wenn ich dies von cmd aus führe, ist dies auf dem Bildschirm:
%Vor%.. und das ist in der TEST.txt:
%Vor% Wenn ich die zweite dup2()
-Anweisung z. B. auskommentieren
Aus Eclipse, auf dem Bildschirm:
%Vor%... und in der Datei TEST.txt:
%Vor%Von cmd, auf dem Bildschirm:
%Vor%... und in der Datei TEST.txt:
%Vor% Ich bin jetzt total verwirrt. Ich lese alle Redirection-Threads hier auf StackOverflow und ich kann nicht verstehen, was vor sich geht.
Wie auch immer, ich habe herausgefunden, dass C-Funktionen auf das stdout zugreifen, das direkt an den Dateideskriptor gebunden ist, während Python ein spezielles Objekt für dieses - stdout-Dateiobjekt verwendet. Also funktioniert die elementare sys.stdout=*something*
nicht mit Ctypes.
Ich habe sogar os.fdopen(1)
auf der dup2-ed-Ausgabe versucht und dann flush()
nach jeder printf
-Anweisung aufgerufen, aber das funktioniert nicht mehr.
Ich habe jetzt keine Ideen mehr und würde mich freuen, wenn jemand eine Lösung dafür hätte.
Verwenden Sie dieselbe C-Laufzeit, die CPython 3.x verwendet (z. B. msvcr100.dll für 3.3). Fügen Sie auch einen Aufruf von fflush(NULL)
vor und nach dem Weiterleiten von stdout
ein. Um ein gutes Maß zu erhalten, leiten Sie die Windows-Zugriffsnummer StandardOutput
um, falls ein Programm die Windows-API direkt verwendet.
Dies kann kompliziert werden, wenn die DLL eine andere C-Laufzeit verwendet, die ihre eigenen POSIX-Dateideskriptoren hat. Das heißt, es sollte in Ordnung sein, wenn es geladen wird, nachdem Sie Windows StandardOutput
umgeleitet haben.
Bearbeiten:
Ich habe das Beispiel so geändert, dass es in Python 3.5+ läuft. Die neue "Universal CRT" von VC ++ 14 macht die Verwendung von C-Standard-I / O über Ctypes erheblich schwieriger.
%Vor% %Vor%