2

私はGUIpythonプログラムと簡単なエラーロギングシステムを持っています

import sys
sys.stderr = open("err.log", "w")

そしてそれはほとんどうまくいきます。私が抱えている問題の1つは、Windows7とPython2.7.3を使用して実行時エラーが発生すると、プログラムを閉じた後にのみファイルerr.logが書き込まれることです。私が収集した関連する問題を読んで、エラーの後にsys.stderrに対してflush()とos.fsync()を実行する必要がありますが、それを簡単に行う方法がわかりません。

1つの方法は、実行時エラーが発生する可能性のあるプログラム内のすべての可能なポイントの後にフラッシュ/ fsyncを実行することですが、これは明らかに良い解決策ではありません。このエラーログを使用する主な理由はデバッグであるため、定義上、実行時エラーが発生する可能性のあるすべての場所以外で、どこをフラッシュする必要があるかを事前に知ることはできません。そのような場所がたくさんあるので、私はそれらのすべてを試して/捕まえる必要がないことを望みます。

私はPyGTKを使用しているので、flush/fsyncを実行できるメインループは表示されません。

エラーの後に常にフラッシュとfsyncを実行するようにPythonに指示する方法はありますか、またはこの(マイナーな)問題を解決する方法を他のアイデアがありますか?

4

2 に答える 2

1

たぶん、ロギングモジュールはログのためのより良い選択でしょうか?

于 2012-11-21T17:05:37.617 に答える
1

私はsyhpoonに同意します:loggingロギングに使用します。しかし、本当にアレンジが必要な場合は、それを無効にするための3番目のbuffering引数を見てください。open

バッファリング引数が指定されている場合、0はバッファリングされていないことを意味し、1は行バッファリングされていることを意味し、数値が大きいほどバッファサイズを指定します。ファイルを開くための推奨される方法は、組み込みのopen()関数を使用することです。

私はこれを試しました、そしてそれは働きます。Pythonセッションの場合:

>>> a = open('/tmp/bar', 'w')
>>> a.write('hi\n')

そして別の用語ウィンドウで:

$ cat /tmp/bar
$

次に、バッファリングを無効にして実験を再実行しました。

>>> a = open('/tmp/bar', 'w', 0)
>>> a.write('hi\n')

と:

$ cat /tmp/var
hi
$

したがって、を使用loggingしますが、そうでない場合は、バッファリングを無効にするだけで必要なものが得られるかどうかを確認してください。

于 2012-11-21T17:15:52.810 に答える