przekierowanie stdout z typami
Próbuję przekierować dane wyjściowe funkcji printf do pliku w systemie Windows. Używam ctypes z python3, aby wywołać funkcje. Mój kod to:
import os, sys
from ctypes import *
if __name__ == '__main__':
print("begin")
saved_stdout=os.dup(1)
test_file=open("TEST.TXT", "w")
os.dup2(test_file.fileno(), 1)
test_file.close()
print("python print")
cdll.msvcrt.printf(b"Printf function 1\n")
cdll.msvcrt.printf(b"Printf function 2\n")
cdll.msvcrt.printf(b"Printf function 3\n")
os.dup2(saved_stdout, 1)
print("end")
Ale kiedy uruchomię kod z Eclipse, otrzymuję na ekranie następujące informacje:
begin
end
Printf function 1
Printf function 2
Printf function 3
... i następujące w TEST.txt
python print
Kiedy uruchamiam to z cmd, to jest to, co jest na ekranie:
begin
end
..i to jest w TEST.txt:
python print
Kiedy komentuję drugidup2()
oświadczenie np.
import os, sys
from ctypes import *
if __name__ == '__main__':
print("begin")
saved_stdout=os.dup(1)
test_file=open("TEST.TXT", "w")
os.dup2(test_file.fileno(), 1)
test_file.close()
print("python print")
cdll.msvcrt.printf(b"Printf function 1\n")
cdll.msvcrt.printf(b"Printf function 2\n")
cdll.msvcrt.printf(b"Printf function 3\n")
#os.dup2(saved_stdout, 1)
print("end")
Z Eclipse na ekranie:
begin
... iw pliku TEST.txt:
python print
end
Printf function 1
Printf function 2
Printf function 3
Z cmd na ekranie:
begin
... iw pliku TEST.txt:
python print
end
Jestem teraz całkowicie zmieszany. Czytam wszystkie wątki przekierowania tutaj na StackOverflow i nie mogę zrozumieć, co się dzieje. W każdym razie to, co zebrałem, to to, że funkcje C mają dostęp do stdout, które jest bezpośrednio powiązane z deskryptorem pliku, podczas gdy python używa specjalnego obiektu dla tego - stdout File Object. Więc elementarnesys.stdout=*something*
nie działa z ctypami. Próbowałem nawetos.fdopen(1)
na wyjściu dup2-ed, a następnie wywołanieflush()
po każdymprintf
oświadczenie, ale to nie działa ponownie. Jestem teraz całkowicie pozbawiony pomysłów i byłbym wdzięczny, gdyby ktoś miał na to rozwiązanie.