Redirecionamento de stdout com ctypes
Estou tentando redirecionar a saída de funções printf para um arquivo no Windows. Estou usando ctypes com python3 para invocar as funções. Meu código é:
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")
Mas quando eu executo o código do Eclipse eu recebo o seguinte na tela:
begin
end
Printf function 1
Printf function 2
Printf function 3
... e o seguinte no TEST.txt
python print
Quando eu executo isso a partir do cmd, isso é o que está na tela:
begin
end
..e isso está no TEST.txt:
python print
Quando eu comento o segundodup2()
declaração, por ex.
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")
Do Eclipse, na tela:
begin
... e no arquivo TEST.txt:
python print
end
Printf function 1
Printf function 2
Printf function 3
De cmd, na tela:
begin
... e no arquivo TEST.txt:
python print
end
Estou totalmente confuso agora. Eu li todos os tópicos de redirecionamento aqui no StackOverflow e não consigo entender o que está acontecendo. De qualquer forma, o que eu aprendi é que as funções C acessam o stdout que é ligado diretamente ao descritor de arquivo, enquanto o python usa um objeto especial para aquele - o objeto de arquivo stdout. Então o elementarsys.stdout=*something*
não funciona com ctypes. Eu até tenteios.fdopen(1)
na saída dup2-ed e, em seguida, chamandoflush()
depois de cadaprintf
declaração, mas isso não está funcionando novamente. Estou totalmente sem idéias agora e apreciaria se alguém tivesse uma solução para isso.