Python:为什么`sys.exit(msg)`从一个线程调用不打印`msg`到stderr?

Jan*_*cke 8 python multithreading exit sys

今天我反对这样一个事实,即sys.exit()从一个子线程调用并不会杀死主进程.我以前不知道这个,这没关系,但我需要很长时间才能意识到这一点.它本来可以节省很多时间,如果sys.exit(msg)打印msg的话stderr.但事实并非如此.

事实证明,这不是我的应用程序中的真正错误; 它sys.exit(msg)以一种有意义的错误调用了一个有意义的错误 - 但我只是看不到这一点.

在文档中sys.exit()说明: "[...]打印任何其他对象sys.stderr并导致退出代码为1"

对于来自子线程的调用,情况并非如此,其中sys.exit()显然表现为thread.exit(): "引发SystemExit异常.当未捕获时,这将导致线程以静默方式退出"

我认为当程序员想要sys.exit(msg)打印错误消息时,应该只打印它 - 独立于调用它的位置.为什么不?我目前看不出任何理由.至少在文档中应该有一个暗示,sys.exit()即消息不是从线程打印的.

你怎么看?为什么错误消息会隐藏在线程中?这有意义吗?

最好的祝福,

Jan-Philip Gehrcke

Ale*_*lli 6

我同意,当sys.exit和SystemExit被主要线程之外的线程调用/引发时,Python文档是不正确的,或者可能更准确地说是不完整的; 请在Python在线跟踪器上打开一个doc问题,这样可以在将来的文档迭代中解决(可能是近期的一个 - 文件修复比代码修复更简单,更顺畅;-).

补救的办法是很容易的,当然-只是包装你使用作为一个目标的任何功能threading.Thread与做了一个装饰try/ except SystemExit, e:周围,并执行"写入标准错误",你需要额外的功能(或者,也许更好,在终止之前使用logging.error调用).但是,由于您正确指出的文档问题,除非并且直到遇到问题并且实际上不得不花费一些时间进行调试以确定问题,否则很难考虑这样做,因为您必须做(代表核心python开发人员的集体 - 抱歉!).