我正在尝试将 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 函数访问直接绑定到文件描述符的标准输出,而 python 使用一个特殊的对象 - 标准输出文件对象。所以基本sys.stdout=*something*
不适用于ctypes。我什至尝试os.fdopen(1)
过 dup2-ed 输出,然后flush()
在每个printf
语句之后调用,但这不再起作用。我现在完全没有想法,如果有人对此有解决方案,我将不胜感激。