调试在控制台上运行的捆绑可执行文件,但并非没有

时间:2019-07-05 19:16:26

标签: python debugging exe pyinstaller

我正在使用一个脚本(一个PyQt5 GUI应用程序),该脚本可以正常工作,也可以在使用控制台创建的exe上按预期工作。我无法摆脱控制台,因为它立即因“致命错误”而崩溃。

是否可以获取有关问题所在的详细信息?我在脚本规范中尝试了debug=True,它显示了各种过程消息,试图运行主文件并因相同的致命错误而崩溃。我还在开头添加了以下代码,以重定向所有打印消息:

file = open('output.txt', 'a')
sys.stdout = file
main.run()
file.close()

同样,它可以正常运行,但是将其转换为非控制台exe会使它立即崩溃。

有人可以让我知道如何查找有关“致命错误”问题的详细信息吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

这是我无法解释的奇怪行为。但是,由于您要求获取更多调试信息的方法,因此在运行而没有附加控制台似乎导致该问题的情况下,我建议以下做法。

首先,如果将stdout重定向到文件,这是一个好主意,但是也应该重定向stderr

最好使用Python的logging模块(它是标准库的一部分)将错误回溯写到文件中。额外的优点是,日志文件还可以从所涉及的库中捕获有价值的调试信息,因为logging是报告非关键错误和警告的常用方法。

演示:

import logging

logging.basicConfig(filename='log.txt', level=logging.DEBUG)
try:
    raise OSError('Emulated exception to be traced back to in log file.')
except Exception:
    logging.error('A critical error occurred.', exc_info=True)

在这里,您告诉它将所有日志信息写入与log.txt相同的文件夹中的名为.exe的文件中。您应该将try: ... except:块包装在主入口点(在您的示例中为main.run())周围。 exc_info=True选项可确保日志文件中包含以前未处理的异常的完整错误回溯。