Python3使用pyinstaller打包exe在windows下运行时cmd卡住问题[已解决]

20200812更新:exe在服务器(没重启过)正常运行了近一个月后,还是挂了,晕,没解决办法了,大家最好还是别打包exe了

环境

不想在目标机器上安装python和依赖,遂使用pyinstaller打包成exe(使用-D参数)

拷贝到目标windows运行,cmd窗口过一段时间总是会卡住,程序不运行,研究半天无解,只能改bat循环启动(使用goto和timeout命令组合)

过一段时间在运行另一个程序的时候发现使用loging方式输出提示不会卡住(原使用print方式输出提示),于是研究分析分享

函数分析

对loging函数进行跟踪分析,发现无论哪种模式都是调用的_log函数,进一步跟踪

Python3使用pyinstaller打包exe在windows下运行时cmd卡住问题[已解决]_第1张图片

 

继续,发现有个输出制作,进去

Python3使用pyinstaller打包exe在windows下运行时cmd卡住问题[已解决]_第2张图片

只是格式生成,那回头看handle试试

Python3使用pyinstaller打包exe在windows下运行时cmd卡住问题[已解决]_第3张图片

一路跟踪,发现使用了sys.stderr流

Python3使用pyinstaller打包exe在windows下运行时cmd卡住问题[已解决]_第4张图片

但是这个只是出错时使用,我们看看hdlr.handlers的实现,一路跟踪分析

Python3使用pyinstaller打包exe在windows下运行时cmd卡住问题[已解决]_第5张图片

Python3使用pyinstaller打包exe在windows下运行时cmd卡住问题[已解决]_第6张图片

其中的filter实现,继续查找

Python3使用pyinstaller打包exe在windows下运行时cmd卡住问题[已解决]_第7张图片

由于能力原因没有找到具体使用,但是根据filter的生成函数,可以看出是使用了线程锁的I/O队列

Python3使用pyinstaller打包exe在windows下运行时cmd卡住问题[已解决]_第8张图片

结论与猜测

之前使用print输出没有I/O线程锁,所以运行一段时间后cmd输出冲突导致卡住,使用loging库后才是按设想的方式输出

另附loging的自定义格式初始化代码(format格式自行百度)

if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO,
                        format='%(asctime)s %(levelname)s %(module)s/%(funcName)s:%(message)s',
                        datefmt='%Y-%m-%d-%X')
    logging.info(u"日志测试")

 

你可能感兴趣的:(编程)