Python 3.4:Windows 上的 PyQt:仅在某些计算机上退出时崩溃

Python 3.4: PyQt on Windows: Crash on exit only on some computers

我有一个 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)的投诉!但为什么?我不使用任何触摸功能!我使用的模块是:QtCoreQtGUI。这是从哪里来的?我可以强制禁用与 class: QGestureRecognizer 相关的所有内容吗?在这种情况下你会怎么做?

更新:

这个问题似乎只发生在 Windows 7 台计算机上。它在 Windows 7 的 2 台计算机上进行了测试,并且发生了同样的崩溃。

释放内存似乎有问题。您可以尝试使用如下函数手动执行此操作:

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 是您的主要 window。


编辑:

if __name__ == '__main__' 行下的所有内容包装成一个 main() 函数有时会起作用,但我不知道为什么。

原来 ALL 我以前遇到的这个程序崩溃的问题是因为 QThread(在 Windows 上)。我认识的所有在 Windows 上使用 QThread 的用户都遇到了类似的问题,并且出于某种原因没有人修复它。

避免 Python 上的 QThread。它完全没有用,而且弊大于利。我现在去了 multiprocessing。好多了,不受GIL的影响。