2011-09-04 14 views
5

私が書いたいくつかのコードをデバッグしようとしています。これには多くの並列処理が含まれています。 sys.stdoutへの出力といくつかのメッセージが2回印刷されるという望ましくない動作をします。デバッグ目的のために、特定の点でsys.stdoutがフラッシュされたかどうかを知ることは非常に便利です。これが可能かどうか、どうすればいいのだろうか?sys.stdoutがPythonでフラッシュされたかどうかを確認する方法

ps。私はそれが重要かどうかわかりませんが、OS Xを使用しています(少なくともsysコマンドはオペレーティングシステムによって異なります)。

+6

フラッシュされているかどうかにかかわらず、sys.stdoutはプロセス間の保証された順序付けを提供しません(同じプロセス内のスレッド間でさえも)。正確なタイムスタンプとログメッセージをそれぞれ別々に追加するのはなぜですか?また、すべてがスレッドセーフかプロセス間キュー経由でデバッグメッセージを送信するのはなぜですか? – James

+0

問題は、同じ出力が2回発生するため、タイムスタンプe.t.cを追加することです。本当に助けにならないでしょう。また、sys.stdoutを何かカスタムに変更しても、実際にはバッファーに問題があるので役に立ちません。私が関連するすべてのPythonプロセスを-uフラグで起動すると、問題は発生しません。私はちょうど何か起こった後にいつもフラッシュするのではなく、何が起こっているのかを知りたいのですが、それは問題の中核を理解することなくちょっとした回避策になるからです。 – koffie

答えて

1

答えは次のとおりです。深刻な醜さ、外部のCモジュールなどはありません。

なぜなら、pythonのファイル実装はFILE *のC(stdio)実装に基づいているからです。だから基本的なpythonファイルオブジェクトは、基本的にちょうど開いたFILEへの参照を持っています。データを書くとき、C実装はデータを書き込みます。そして、それをflush()に伝えると、pythonはフラッシュ呼び出しを転送します。したがって、Pythonは情報を保持しません。基本的なCレイヤーであっても、クイック検索では文書化されたAPIがないため、この情報にアクセスできるようになりましたが、恐らくFILEのどこかにあるので、必然的に必要ならば理論的には読み出すことができます。

+0

ありがとうございました。できるだけ多くのトラブルがあります。私はこれをデバッグのためだけに知りたかったので、私はsys.stdout.flush()ステートメントを宣言し、プログラムの動作が変更されたかどうかを確認しました。それが変更された場合、私はそれがその時点でフラッシュされていないと仮定しました。 – koffie

関連する問題