printf 関数の出力を Windows 上のファイルにリダイレクトしようとしています。関数を呼び出すために、python3で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()
たとえば、2番目のステートメントをコメントアウトすると
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ファイルオブジェクトを使用するということです。そのため、エレメンタリーsys.stdout=*something*
は ctypes では機能しません。os.fdopen(1)
dup2-ed 出力を試してから、flush()
すべてのprintf
ステートメントの後に呼び出すことさえしましたが、これは再び機能しません。私は今、まったくアイデアがありません。誰かがこれに対する解決策を持っていれば幸いです。