我有一个Python程序,我与cx_freeze
一起打包以生成可执行文件。该程序严格来说是一个用于数据采集的桌面程序。它工作正常并且在每台计算机上都很好,但是在我们的一个Windows 7协作者的桌面上,它只在退出时崩溃(我强调没有给出pythonic错误。只是一个低级别的崩溃,零信息关于它)。只需启动和退出程序就会崩溃!
我让那个人为我创建了一个内存转储,他做到了。奇怪的部分如下:从中创建内存转储并使用WinDbg进行分析会产生以下错误链:
STACK_TEXT:
WARNING: Stack unwind information not available. Following frames may be wrong.
0020f940 5c51b34e 5c7bd640 9d7a3385 03c93748 QtCore4!QHashData::free_helper+0x26
0020f974 76e314bd 00b30000 00000000 03e0c4c0 QtGui4!QGestureRecognizer::reset+0x1f9e
0020f9a0 5c51c968 03c93748 5d3608c2 00000001 kernel32!HeapFree+0x14
0020f9a8 5d3608c2 00000001 03c93748 03891250 QtGui4!QGestureRecognizer::reset+0x35b8
0020f9c0 5d3627b5 9d0dae1c 03891250 03cac0a0 QtCore4!QObjectPrivate::deleteChildren+0x72
00000000 00000000 00000000 00000000 00000000 QtCore4!QObject::~QObject+0x3e5
现在让我感到惊讶的是,来自QGestureRecognizer
的投诉(part of QtGUI apparently)给出了!但为什么?我没有使用任何触控功能!我使用的模块是:QtCore
和QtGUI
。这是从哪里来的?我是否可以强制禁用与该类相关的所有内容:QGestureRecognizer
?在这种情况下你会做什么?
更新
此问题似乎只发生在Windows 7计算机上。它在2台装有Windows 7的计算机上进行了测试,同样发生了崩溃。
答案 0 :(得分:1)
似乎无法释放内存。您可以尝试使用以下函数手动执行此操作:
!mdt
然后在主窗口小部件中定义清理方法。
def clean(item):
"""Clean up the memory by closing and deleting the item if possible."""
if isinstance(item, list) or isinstance(item, dict):
for _ in range(len(item)):
clean(list(item).pop())
else:
try:
item.close()
except (RuntimeError, AttributeError): # deleted or no close method
try:
item.deleteLater()
except (RuntimeError, AttributeError): # deleted or no deleteLater method
pass
最后,在致电class MyWindow(QWidget):
def cleanUp(self):
# Clean up everything
for i in self.__dict__:
item = self.__dict__[i]
clean(item)
之前,您必须像这样连接:
qt_app._exec()
其中qt_app.aboutToQuit.connect(app.cleanUp)
是您的主窗口。
修改强>
将app
行下的所有内容包装到单个if __name__ == '__main__'
函数中有时会有效,但我不知道为什么。
答案 1 :(得分:0)
事实证明, ALL 我曾经遇到过这个程序崩溃的问题是因为QThread(在Windows上)。我所知道的在Windows上使用QThread的所有用户都遇到了类似的问题,并且出于某种原因没有人在修复它。
避免在Python上使用QThread。它完全没用,比有用更有害。我现在去了multiprocessing
。它好得多,不受GIL的影响。