如何解决Python打包exe后抛异常秒退无法查看报错信息的问题
核心原因
auto-py-to-exe底层调用PyInstaller完成打包,双击生成的控制台exe时,系统会为程序临时创建附属控制台窗口,一旦程序因未捕获异常终止,这个临时窗口会跟着进程立刻销毁。
你之前加的input()不生效分两种情况:如果是主逻辑运行到一半抛出异常,执行流会直接中断,根本跑不到你写在流程末尾的input();如果异常来自第三方库的C扩展层、解释器启动阶段、依赖缺失场景,Python层的常规阻塞代码完全不会被触发,自然拦不住窗口关闭。
可用解决方案
全局异常钩子(优先用,覆盖90%以上场景)
把下面的代码放在你程序的最开头,所有业务逻辑之前执行,就能拦截所有Python层的未捕获异常,不管是你自己写的代码还是第三方pip库抛的错,都会先打印完整错误栈,等你按回车再退出:import sys import traceback def catch_all_exceptions(exc_type, exc_value, exc_traceback): traceback.print_exception(exc_type, exc_value, exc_traceback) input("\n程序触发异常,按回车键关闭窗口") # 可选:把错误自动存到日志文件,不用怕漏看 with open("error.log", "a", encoding="utf-8") as f: traceback.print_exception(exc_type, exc_value, exc_traceback, file=f) sys.excepthook = catch_all_exceptions # 后面放你原来的所有代码 if __name__ == "__main__": # 你的主逻辑代码 pass注意这段必须放在最顶部,不要塞到函数或者判断分支里,不然钩子注册不生效。
命令行手动启动(零改代码,覆盖所有崩溃场景)
不要直接双击exe,先手动打开cmd或者PowerShell窗口,把exe拖到命令行窗口里按回车运行。这时候程序跑在你手动开的命令行窗口里,哪怕程序崩了进程退了,命令行窗口本身不会关,所有报错信息都会完整留在窗口里,哪怕是C扩展段错误、打包缺文件这种Python钩子拦不住的崩溃,都能看到完整提示。批处理启动(适合分发场景,不用改代码)
在exe同文件夹下新建一个.bat后缀的文件,写入下面的内容,之后双击bat启动程序就行,程序崩了之后会自动停住:@echo off 你的程序文件名.exe pause
之前方案失效的原因
直接在代码末尾加input()只在程序正常跑完所有逻辑的时候才会执行,只要中途抛异常,执行流直接跳出,根本到不了这行代码,自然挡不住窗口关闭。
内容的提问来源于stack exchange,提问作者superprocoder1233211

