使用Twisted的Python应用程序在用户注销Windows XP后停止运行
我继承了一个使用TwistedPython库的项目。用户注销Windows XP后,应用程序将终止 Python代码已使用bbfreeze转换为可执行文件。此外,bbfreeze生成的可执行文件使用instsrv.exe和srvany.exe注册为Windows服务 我从Twisted网站上获取了一个简单的聊天示例,从bbfreeze创建了一个可执行文件,并在instsrv和srvany中注册了它,同样的问题也出现了:用户注销后,可执行文件停止运行 我倾向于认为Windows XP和Twisted库的某些东西导致应用程序终止或停止运行。特别是,我认为可能是reactor代码中的某些东西导致应用程序代码停止运行。然而,我还不能证实这一点 是否有其他人看到了这一点,或者对可能导致这一情况的原因有任何想法 谢谢, 标记使用Twisted的Python应用程序在用户注销Windows XP后停止运行,python,windows-services,twisted,Python,Windows Services,Twisted,我继承了一个使用TwistedPython库的项目。用户注销Windows XP后,应用程序将终止 Python代码已使用bbfreeze转换为可执行文件。此外,bbfreeze生成的可执行文件使用instsrv.exe和srvany.exe注册为Windows服务 我从Twisted网站上获取了一个简单的聊天示例,从bbfreeze创建了一个可执行文件,并在instsrv和srvany中注册了它,同样的问题也出现了:用户注销后,可执行文件停止运行 我倾向于认为Windows XP和Twiste
- WM_QUERYENDSESSION被发送到[当前桌面上]的每个窗口李>
- CTRL\u注销\u事件发送到每个进程
顺便说一句,我使用下面的代码在脚本中记录未处理的异常。如果脚本要在无人参与的情况下运行(或由您诊断问题的其他人运行:^),这总是一个好主意
#设置日志记录#####################################
导入系统、操作系统、日志
logfile=os.path.splitext(os.path.basename(sys.argv[0]))[0]+“.log”
logging.basicConfig(\
格式='(asctime)s%(levelname)-8s%(消息)s'\
文件名=日志文件\
级别=logging.DEBUG)
l=logging.getLogger()
#从pdb提示符重新启动后避免多个副本
如果len(l.handlers)Twisted本身没有任何特殊代码来响应ivan_pozdeev在回答中提到的Windows特定事件。不过,win32eventreactor将启动Windows消息循环-不管这是否重要,我不知道。我在没有bbfreeze的情况下尝试了此操作,但问题仍然存在。我也可以用一个简单的。好的。现在我们知道,扭曲是罪魁祸首。谢谢你的例子,如果谷歌失败了,这对于进一步挖掘这一点是非常宝贵的。不过,目前还没有:请看上面我的更新。是的,是SIGBREAK造成了问题。我打开日志并确认。如果指定reactor.run(False),则在注销Windows XP时,信号处理将被禁用,服务不再终止。谢谢你的帮助。
# set up logging #####################################
import sys,os,logging
logfile = os.path.splitext(os.path.basename(sys.argv[0]))[0]+".log"
logging.basicConfig(\
format='%(asctime)s %(levelname)-8s %(message)s',\
filename=logfile,\
level=logging.DEBUG)
l = logging.getLogger()
#to avoid multiple copies after restart from pdb prompt
if len(l.handlers)<=1: l.addHandler(logging.StreamHandler(sys.stdout))
#hook to log unhandled exceptions
def excepthook(type,value,traceback):
logging.exception("Unhandled exception occured",exc_info=(type,value,traceback))
old_excepthook(type,value,traceback)
old_excepthook = sys.excepthook
sys.excepthook = excepthook
# ####################################################