Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 手动触发PyQt/PySide内存错误? 背景_Python_Pyqt_Pyqt5 - Fatal编程技术网

Python 手动触发PyQt/PySide内存错误? 背景

Python 手动触发PyQt/PySide内存错误? 背景,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我正在创建一个PyQt5应用程序,遇到了这个问题 内部C++对象已删除 这是由以下描述的陷阱造成的: 如果一个QObject在Python中不在范围内,它将被删除 因此,我可以通过使用可选的parent=参数或通过存储对我遇到问题的对象的引用来避免这个问题 问题: 为了测试目的,我想知道是否可以手动触发这个问题(内部C++对象已经删除) 这是一个间歇性的问题,所以为了能够测试这一点,我需要一些可靠的方法来复制它 (我不想存储对所有对象的引用,而是只在需要时保留引用) 我正在运行PyQt5.

我正在创建一个PyQt5应用程序,遇到了这个问题

<代码>内部C++对象已删除

这是由以下描述的陷阱造成的:

如果一个QObject在Python中不在范围内,它将被删除

因此,我可以通过使用可选的
parent=
参数或通过存储对我遇到问题的对象的引用来避免这个问题

问题:

为了测试目的,我想知道<强>是否可以手动触发这个问题(<代码>内部C++对象已经删除)

这是一个间歇性的问题,所以为了能够测试这一点,我需要一些可靠的方法来复制它

(我不想存储对所有对象的引用,而是只在需要时保留引用)



我正在运行PyQt5.15和Python3.8。请注意:根据绑定的不同,错误消息会有所不同:

  • PyQt5

    RuntimeError: wrapped C/C++ object of type <QtClass> has been deleted
    
    from PyQt5 import QtCore
    import sip
    
    o = QtCore.QObject()
    o.setProperty("foo", "bar")
    sip.delete(o)
    o.setProperty("foo", "bar")
    
  • PySide2

    RuntimeError: Internal C++ object (PySide2.<QtModule>.<QtClass>) already deleted.
    
    from PySide2 import QtCore
    import shiboken2
    
    o = QtCore.QObject()
    o.setProperty("foo", "bar")
    shiboken2.delete(o)
    o.setProperty("foo", "bar")
    
谢谢您的帮助!——我仍然不确定我是否理解底层架构,但是否有可能触发(全局)垃圾收集之类的事件。IrcC++没有这个,所以我猜它可能在Python级别上。(我确实尝试过使用Python的
gc.collect()
,但这并没有引发我所看到的任何问题)我想我要问的是:是否有可能对所有对象执行类似于您所描述的、但全局性的操作?在实际测试中,很难为所有对象添加代码(我可能会错过一些东西)。