【发布时间】:2012-11-05 23:10:20
【问题描述】:
我正在使用 Python 和 PySide 构建一个相当复杂的应用程序。终于发布的日子快到了,所以我想将此应用程序构建为 exe。
但是,我手上有一个奇怪的问题。我过去使用过 PyInstaller(顺便说一下,使用的是第 2 版),但我从来没有遇到过这种情况。
基本上,当我使用 --console 标志构建应用程序时,它可以正常工作 - 但它会打开控制台窗口。当我使用窗口标志 (-w) 构建应用程序时,它无法正常工作。它开始了一切,但有所有这些奇怪的故障。例如,加载文本文件通常会引发BadFileDescriptor 错误(在控制台模式下不会发生),并且应用程序在执行特定任务后会崩溃。更糟糕的是任务是一个循环,第一次执行还不错,但再次开始执行时就崩溃了。
当我查看 minidump 文件时,有一些关于 QtGui4.dll 文件的内存访问冲突的错误。同样,这不会在控制台模式下发生。
有人有什么想法吗?
【问题讨论】:
-
您的程序使用
print语句还是sys.stdout.write?读取here(不幸的是您是意大利语)错误的文件描述符错误可能是由此引起的,您可以通过删除/注释掉prints 或重定向sys.stdout或改用logging来解决它。似乎当您在窗口模式下启动应用程序时,stdout是一个固定大小的缓冲区,这会导致内存访问冲突。 -
它确实使用了打印语句。你能告诉我更多关于如何重定向 sys.stdout 的信息吗?我的意思是,是否可以用一行代码轻松地一次性替换软件中的所有打印语句?
-
您可以在程序执行的最开始放置类似
import sys; import tempfile; sys.stdout = tempfile.TemporaryFile(); sys.stderr = tempfile.TemporaryFile()(希望格式更好)的内容,然后所有prints 将被重定向到一个临时文件,该文件将当你的程序退出时被删除。对于更长期的解决方案,我会考虑使用logging。 -
非常感谢!我会试试这个。我已经启用了日志记录,但我的大部分语句都是
print和logging。再次感谢。 -
@Bakuriu,嗯,出于某种原因,它对我不起作用:我现在有这个:
sys.stdout = tempfile.TemporaryFile() sys.stderr = tempfile.TemporaryFile()但由于某种原因,我仍然可以在我的 PyCharm 控制台中看到打印,并且应用程序仍然可以不行。 --- 编辑,没关系,我的代码的一部分中有reload(sys)。现在可以了!
标签: python qt pyqt pyside pyinstaller