2009-07-30 42 views
8

今天我跑了反對的事實,即sys.exit()從兒童線程調用不殺的主要過程。我以前不知道這一點,這沒關係,但我需要很長時間才能認識到這一點。這將有可能挽救太多太多的時間,如果sys.exit(msg)會打印msgstderr。但事實並非如此。Python:爲什麼從線程調用`sys.exit(msg)`不會打印`msg`到stderr?

原來,這是不是在我的應用程序中的真正的bug;它以一種有意義的錯誤方式稱爲sys.exit(msg) - 但我無法看到這一點。

In the docs for sys.exit() it is stated「[...]的任何其他對象被打印到sys.stderr和結果在1退出代碼」

不用於從子線程的調用真實,其中sys.exit()明顯表現爲thread.exit()「提高SystemExit例外,如果沒有捕獲,這將導致線程退出默默。」

我認爲當一個程序員想要sys.exit(msg)打印錯誤消息,那麼這應該只是印刷 - 獨立於它被稱爲地方。爲什麼不?我目前沒有看到任何理由。至少應該在sys.exit()的文檔中提示該消息不是從線程打印的。

您認爲如何?爲什麼錯誤消息隱藏在線程中?這有意義嗎?

最好的問候,

揚菲利普Gehrcke

回答

6

我同意Python文檔是不正確的,也許更準確地說不完整,關於sys.exit和SystemExit叫/比主要的一個其他線程時提出;請在Python在線跟蹤器上打開一個文檔問題,這樣可以在將來的文檔迭代中解決這個問題(可能是不久的將來 - 文檔修復比代碼修復更容易,更順暢;-)。

的補救方法是很容易的,當然 - 只是包裝你使用作爲與做它周圍的try/except SystemExit, e:一個裝飾一threading.Thread目標的任何功能,並執行「寫入標準錯誤」額外的功能你需要(或者,也許更好的是,在終止之前使用logging.error調用)。但是,對於您正確指出的文檔問題,除非遇到問題並且實際上必須花費一些時間進行調試才能確定問題,否則很難考慮這樣做,因爲您必須(以核心Python開發人員的集體代表 - 對不起!)。

+0

你給了我一個很好的建議,再次;) 順便說一句:這是如此之大,你在這裏分享你的知識。我發現你目前花大部分時間用純Python專家來填補這個平臺!這是社區需要的,但這不是理所當然的事情。非常非常感謝你! Jan-Philip – 2009-07-30 21:46:29

0

不要在Python中的所有線程都是平等的。從線程調用sys.exit實際上並不會退出系統。因此,從子線程調用sys.exit()是無意義的,所以它的行爲並不像你期望的那樣合理。

page更多地談論線程對象和線程和特殊的「主」線程之間的差異。

相關問題