printf関数の出力をWindows上のファイルにリダイレクトしようとしています。私は関数を呼び出すためにpython3でctypesを使用しています。 TEST.TXTctypesで標準出力リダイレクト
python print
に
begin
end
Printf function 1
Printf function 2
Printf function 3
...と、以下:
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からコードを実行したとき、私は、画面上で、次を得る:私のコードです
これをcmdから実行すると、画面上に表示されます。
begin
end
..andこれはTEST.TXTである:私は、例えば二dup2()
文をコメントアウト
python print
画面上のEclipseから
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")
、:
begin
...とTest.txtファイル内:CMDから
python print
end
Printf function 1
Printf function 2
Printf function 3
、画面上:
begin
...とTEST.txtファイル:
python print
end
私は完全に今混乱しています。私はStackOverflow上のすべてのリダイレクトスレッドをここで読んで、何が起こっているのか理解できません。 とにかく、私が集めたのは、C関数がファイル記述子に直接バインドされたstdoutにアクセスするのに対し、pythonはそのstdout Fileオブジェクト用の特別なオブジェクトを使用しているということです。そのため、基本sys.stdout=*something*
はctypesでは機能しません。 私はをdup2-edの出力に試してみて、printf
の文のたびにflush()
を呼び出しても、これは再び動作しません。 私は今考えていないので、誰かがこれに対する解決策を持っていると感謝しています。
は、なぜあなたは何かを印刷するには、 'ctypes'を使うのですか? – jfs
related:[C共有ライブラリがpythonでstdoutに出力されないようにするにはどうすればいいですか?](http://stackoverflow.com/q/5081657/4279)( 'os.devnull'の代わりにファイルを使用してください) – jfs
私は、このスレッドを読むと役立たない。私のコードは例のコードとほぼ同じです。私はctypesを必要とします。なぜなら、後でprintfsを持つCライブラリのユニットテストのために使用するからです。 –