我試圖將printf函數的輸出重定向到Windows上的文件。我使用python3的ctypes來調用函數。我的代碼是:標準輸出重定向與ctypes
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。 我甚至在DUP2-ED輸出試圖os.fdopen(1)
,然後調用每一個printf
後聲明flush()
但這又壞了。 我現在完全沒有想法,並希望如果有人有這個解決方案。
爲什麼要使用'ctypes'打印的東西嗎? – jfs
相關:[我如何防止C共享庫打印在標準輸出蟒蛇?](http://stackoverflow.com/q/5081657/4279)(使用您的文件,而不是'os.devnull') – jfs
我'已經閱讀過這個帖子,這沒有幫助。我的代碼和例子幾乎一樣。我需要ctypes,因爲稍後我會用它來測試一個C庫,它裏面有printfs。 –