2009-07-30 88 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更多地谈论线程对象和线程和特殊的“主”线程之间的差异。

相关问题