перенаправление стандартного вывода с помощью ctypes
Я пытаюсь перенаправить вывод функций printf в файл в Windows. Я использую ctypes с python3 для вызова функций. Мой код:
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")
Но когда я запускаю код из Eclipse, я получаю на экране следующее:
begin
end
Printf function 1
Printf function 2
Printf function 3
... и следующее в TEST.txt
python print
Когда я запускаю это из cmd, это то, что на экране:
begin
end
..и это в TEST.txt:
python print
Когда я закомментирую второйdup2()
утверждение, например
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")
Из Eclipse на экране:
begin
... и в файле TEST.txt:
python print
end
Printf function 1
Printf function 2
Printf function 3
Из cmd, на экране:
begin
... и в файле TEST.txt:
python print
end
Я сейчас совершенно сбит с толку. Я прочитал все потоки перенаправления здесь, на StackOverflow, и я не могу понять, что происходит. В любом случае, я понял, что функции C получают доступ к stdout, который привязан непосредственно к дескриптору файла, в то время как python использует специальный объект для этого - stdout File Object. Так что элементарноsys.stdout=*something*
не работает с ctypes. Я даже пыталсяos.fdopen(1)
на выходе dup2-ed, а затем вызовflush()
после каждогоprintf
заявление, но это не работает снова. У меня совершенно нет идей, и я был бы признателен, если бы у кого-то было решение для этого.