2009-07-30 8 views
8

今日私は、子スレッドから呼び出されたsys.exit()がメインプロセスを強制終了しないという事実に反して走りました。私は前にこれを知らなかった、これは大丈夫ですが、私はこれを実現するために長い時間が必要でした。 sys.exit(msg)が〜stderrと印刷されていた場合、保存時間が大幅に短縮されます。しかし、それはしませんでした。Python: `sys.exit(msg)`がスレッドから呼び出され、 `msg`をstderrに出力しないのはなぜですか?

私のアプリケーションでは実際のバグではないことが判明しました。それは意義のあるエラーで意味のあるエラーでsys.exit(msg)と呼ばれましたが、私はこれを見ることができませんでした。

In the docs for sys.exit() it is stated

「[...]他の目的は、1の終了コードでsys.stderr、その結果に印刷されている」

これは、子スレッドからの呼び出しのためにない真あります は「SystemExit例外を上げてキャッチされない場合は、このスレッドは黙っを終了します。」

thread.exit()としてどこsys.exit()は明らかに振る舞います

私は、プログラマーがsys.exit(msg)にエラーメッセージを表示したいと思うと、これは単に呼び出された場所から独立して表示されるべきです。何故なの?私は現在、何らかの理由を見ません。少なくとも、sys.exit()のドキュメントにメッセージがスレッドから出力されないというヒントがあるはずです。

あなたはどう思いますか?エラーメッセージがスレッドから隠蔽されるのはなぜですか?これは理にかなっていますか?

敬具、

月、フィリップGehrcke

答えて

6

私は、sys.exitとSystemExitに関して、主なもの以外のスレッドによって呼び出されたり呼び出されたりすると、Pythonのドキュメントが正しくない、あるいはより正確には不完全であることに同意します。 Pythonのオンライントラッカーでドキュメントの問題を開くようにしてください。これは、将来のドキュメントの反復で扱うことができます(おそらく近い将来のドキュメント修正は、コード修正よりも簡単でスムーズです。

救済はもちろん、非常に簡単です - ちょうどあなたがその周りtry/except SystemExit, e:を行いデコレータとthreading.Threadのターゲットとして使用している任意の関数をラップし、余分な機能を「stderrに書き込み」を行い、終了する前に(必要に応じてlogging.error呼び出しを使用する必要があります)。しかし、あなたが正しく指摘しているドキュメントの問題では、問題を抱えていて実際にデバッグに時間を費やしてピンを固定しなければならない限り、これを行うことを考えるのは難しいです。コアのPython開発者を集合的に代わって - すみません!

+0

あなたは私に良い助言をくれました;) Btw:ここであなたの知識を共有するのはとても素晴らしいことです。私はあなたが現在、純粋なエキスパートのPythonのものでこのプラットフォームを埋めるためにあなたの時間の多くを費やしていることを知っています!これはコミュニティが必要とするものですが、それはもちろん問題ではありません。非常に非常に大きなこれをありがとう! Jan-Philip –

+0

@ Jan-Philip、あなたは大歓迎です。そして、あなたに感謝の言葉をいただき、ありがとうございます。 –

0

のpython内のすべてのスレッドが同じわけではありません。スレッドからsys.exitを呼び出すと、実際にはシステムは終了しません。したがって、子スレッドからsys.exit()を呼び出すことは無意味なので、期待通りの動作をしないという意味になります。

このpageはスレッドオブジェクトと、スレッドと特別な「メイン」スレッドの違いについて説明しています。

関連する問題