5

私は Windows Vista で PyDev と Python 3.2 を使用して Eclipse を実行しており、Python と ctypes のチュートリアルを進めていました。

ただし、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 で作業したいのですが、スクリプトをテストするたびにコマンド プロンプトを開き続ける必要はありません。コンソール出力でこの順序を修正する方法はありますか? そして、なぜこれが起こるのですか?

4

2 に答える 2

1

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

msvcrt.fflush(msvcrt.stdout)

stdout非バッファ モードを強制することもできます。

msvcrt.setvbuf(msvcrt.stdout, None, _IONBF, 0)
于 2012-07-25T16:59:26.720 に答える
0

これはあなたの質問には答えませんが、printf は23印刷された文字数を返しますが、それをsprintfand に置き換えると、文字列が返され、期待どおりの順序でコンソールに表示されます。

ただし、Python で同じことができるのに、mscvcrt の printf を使用する理由がわかりません。

于 2012-07-25T16:38:47.340 に答える