在Python中打印守护线程异常

在Python中打印守护线程异常,python,multithreading,Python,Multithreading,Python不会打印来自守护进程线程中引发的异常的回溯消息 例如,此代码创建守护线程并在新线程中引发异常: def error_raiser(): raise Exception import threading thread = threading.Thread(target=error_raiser) thread.daemon = True thread.start() 但不打印回溯。(它没有输出) 但是,如果该线程未设置为守护进程线程,Python将打印回溯。以下是注释掉一行

Python不会打印来自守护进程线程中引发的异常的回溯消息

例如,此代码创建守护线程并在新线程中引发异常:

def error_raiser():
    raise Exception

import threading
thread = threading.Thread(target=error_raiser)
thread.daemon = True
thread.start()
但不打印回溯。(它没有输出)

但是,如果该线程未设置为守护进程线程,Python将打印回溯。以下是注释掉一行的相同代码:

def error_raiser():
    raise Exception

import threading
thread = threading.Thread(target=error_raiser)
# thread.daemon = True
thread.start()
以及输出:

Exception in Thread-1:
Traceback (most recent call last):
  File "C:\Python26\lib\threading.py", line 525, in __bootstrap_inner
    self.run()
  File "C:\Python26\lib\threading.py", line 477, in run
    self.__target(*self.__args, **self.__kwargs)
  File "test.py", line 2, in error_raiser
    raise Exception
Exception
在Python2.6.2和Python3.0.1中执行此代码,并给出相同的结果。然而,有趣的是,如果我通过在ipythonshell中导入代码来执行代码,那么无论线程是否是守护线程,都会显示异常

根据文档,“守护进程”标志的唯一意义是“当只剩下守护进程线程时,整个Python程序就会退出”。这让我相信,在异常后不打印回溯是Python中的一个错误,除非我在文档中遗漏了什么


这是一个bug,还是我在文档中遗漏了什么,而这种行为是故意的?如果是有意的,我如何强制Python在不使用IPython的情况下在守护进程线程中打印回溯?

根据Wikipedia的定义,守护进程应该从控制tty中分离出来,因此我认为没有显示异常是正确的(毕竟,即使关闭启动它的shell,守护进程也应该继续工作)..

至于如何打印回溯,我认为一个简单的try/except\u then\u log\u to\u文件就可以了:)

这是一个bug,还是我在文档中遗漏了什么,而这种行为是故意的

你自己基本上已经说明了原因,但没有意识到:

根据文档,“守护进程”标志的唯一意义是“当只剩下守护进程线程时,整个Python程序将退出。”

如果您有一个非守护线程,Python将在
thread.start()之后等待它。这种等待包括它所做的任何事情,包括引发和处理异常

如果有守护线程,Python不会在
thread.start()之后等待它。相反,在没有进一步说明的情况下,Python会立即退出。这意味着您的线程永远没有机会引发或处理异常


如果是有意的,我如何强制Python在不使用IPython的情况下在守护进程线程中打印回溯

对于
守护进程
线程,线程应该做什么无关紧要。如果它被指示打印一些东西,同样的情况也会发生

这也意味着您无法有条件地等待守护进程的操作。您可以设置
thread.daemon=False
并获取所有回溯,以及所有打印、I/O和其他操作。或者设置
thread.daemon=True
,在所有其他线程都死机后,不会得到回溯,也不会得到打印、I/O或其他操作


然而,有趣的是,如果我通过在ipythonshell中导入代码来执行代码,那么无论线程是否是守护线程,都会显示异常


贝壳的问题是,除非你杀死它们,否则它们永远不会离开。由于shell的解释器在等待您的输入时不会退出,因此任何启动的
守护进程
线程都会保持活动状态。

您的解决方案非常适合打印回溯。我没有想到尝试……只是因为我依赖Python来为我进行打印。顺便说一下,根据文档,我相信daemonic线程在程序退出时终止,而不仅仅是分离。谢谢你的帮助!