エラーとその結果としてのメモリアクセス違反は、ウィンドウモードのアプリケーションが固定サイズのバッファであるBadFileDescriptor
という事実によって引き起こされます。stdout
したがって、をstdout
使用して、print
またはsys.stdout
直接に書き込みを行っている場合は、しばらくするとこれらのエラーが表示されます。
これは次の方法で修正できます。
- 上の書き込みを削除/コメントアウト
stdout
logging
stdoutに印刷する代わりに使用する
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
エラーを回避するためではなく、ファイルに書き込む必要があります。)