エラーとその結果としてのメモリアクセス違反は、ウィンドウモードのアプリケーションが固定サイズのバッファであるBadFileDescriptorという事実によって引き起こされます。stdoutしたがって、をstdout使用して、printまたはsys.stdout直接に書き込みを行っている場合は、しばらくするとこれらのエラーが表示されます。
これは次の方法で修正できます。
- 上の書き込みを削除/コメントアウト
stdout
loggingstdoutに印刷する代わりに使用する
stdoutアプリケーションの実行の開始時にリダイレクトします。loggingこれは、デバッグステートメントをに移動する方が良い選択だと思いますが、変更する必要のあるコードが少ないソリューションです。
リダイレクトstdoutするには、次の種類のコードを使用できます。
import sys
import tempfile
sys.stdout = tempfile.TemporaryFile()
sys.stderr = tempfile.TemporaryFile()
プログラムを実行する直前。カスタムオブジェクトを使用して、出力を「ログ」ファイルなどに配置することもできます。重要なことは、出力が固定サイズのバッファーをいっぱいにしないことです。
たとえば、次のようなことを実行して、loggingコードをあまり変更せずにモジュールを利用できるようにすることができます。
import sys
import logging
debug_logger = logging.getLogger('debug')
debug_logger.write = debug_logger.debug #consider all prints as debug information
debug_logger.flush = lambda: None # this may be called when printing
#debug_logger.setLevel(logging.DEBUG) #activate debug logger output
sys.stdout = debug_logger
このアプローチの欠点は、各行に対してprintより多くの呼び出しを実行することです。stdout.write
>>> print 'test'
DEBUG:debug:test
DEBUG:debug:
必要に応じて、「フルライン」でのみwrite呼び出す実際の関数を作成するこの種の動作をおそらく回避できます。the_logger.debug
printとにかく、これらの種類のソリューションは一時的なものであり、 sをへの呼び出しに移植する前にのみ使用する必要があると思いますlogging.debug。
(明らかに、ロガーはstdoutエラーを回避するためではなく、ファイルに書き込む必要があります。)