2012-07-25 9 views
5

Windows VistaでPyDevとPython 3.2でEclipseを実行していて、Pythonとctypesに関するチュートリアルを行っていました。EclipseとPython 3:ctypesのprintf()が後続のprint()文の後にコンソール出力に表示される理由

しかし、msvcrt.printf()を呼び出して文字列を表示すると、他のすべてのprint文が表示されるまで、Eclipseのコンソール出力には表示されません。ここで

は、私が使用する正確なコードです:

from ctypes import * 

msvcrt = cdll.msvcrt 
message_string = "Hello Worlds!\n" 

printf = msvcrt.printf 
print(printf("Testing: %s".encode('ascii'),message_string.encode('ascii'))) 


print("foo") 

print("why!?") 

、ここでは出力されます:

23 
foo 
why!? 
Testing: Hello Worlds! 

(一般的にはCのために)私は他の場所で見ているだけの説明はprintf関数がバッファリングされた方法に言及します表示する前に改行が必要ですが、文字列に改行があり、printf文に 'printf( "Testing:%s \ n"、...')を直接追加しても差はありません。

私はEclipseで作業したいので、スクリプトをテストするたびにコマンドプロンプトを開いたままにしたくないので、コンソール出力でこの順序を修正できる方法はありますか?なぜこれが起こるのですか?

答えて

0

これはあなたの質問に答えることはできませんが、printfは23を返します。これはsprintfに置き換えることができ、文字列が返され、正しい順序でコンソールに表示されます。

しかし、私はmscvcrtのprintfをpythonで同じように使うことはできません。

+0

私はただのctypesのチュートリアル、以下されたI後でprintf以外の関数に使用する予定です。私がこれを理解してそれを働かせる理由は、この単純な作業で何が起こっているのか理解できない場合、どのように複雑なものを理解することができるのだろうか? – Brian

1

C標準ライブラリでは、stdoutがコンソールではなくファイルまたはパイプに接続されていると判断した場合、その出力をブロックバッファします。あなたは、発行することによって、この問題を回避することができますfflushprintf後:

msvcrt.fflush(msvcrt.stdout) 
また、非バッファモードに stdoutを強制することができるかもしれ

msvcrt.setvbuf(msvcrt.stdout, None, _IONBF, 0) 
+0

説明をありがとうございますが、修正については、私はこのエラーを受け取ります: "AttributeError:function 'stdout' not found" – Brian

+0

msvcrtからstdoutへのポインタを取得するのは非常に困難です。 http://osdir.com/ml/python.ctypes/2005-09/msg00019.htmlを参照してください。 – ecatmur

関連する問題