【问题标题】:PySide segmentation fault on QObject instantiationQObject 实例化上的 PySide 分段错误
【发布时间】:2019-04-19 07:58:03
【问题描述】:

我有一个类是我的其他非 qt 类的基础。此类使用 Signal 实例实例化 QObject 类。不幸的是,有时它会引发分段错误错误。这是我的代码:

class PublisherSignal(QObject):
    notify = Signal(list)


class PublisherBase:
    def __init__(self, *args, **kwargs):
        super(PublisherBase, self).__init__(*args, **kwargs)
        self._signal = PublisherSignal()

故障处理程序显示,分段错误发生在 PublisherSignal() 类实例化上。并非总是如此。在大多数情况下,它工作正常。不涉及线程。 PublisherBase 的子类不是 QObject 的子类。
段错误的原因可能是什么?

【问题讨论】:

  • 我提供的那个有什么问题?它在实例化示例中的PublisherBase 类(实例化PublisherSignal)时崩溃。
  • 你的例子不完整,你只声明了2个类但你没有使用它,你应该知道问题可能是你使用它的方式引起的。因此,如果您需要帮助,最好提供minimal reproducible example。 :-)
  • @Djent 好吧,这就是您依赖不受支持的旧版软件所得到的。像这样的问题现在将永远得到解决。如果您想正确诊断问题,则必须编译至少 qt4 和 pyside 的调试版本,以便获得完整的堆栈跟踪。这可能足以揭示问题的根本原因是什么(但我不会指望它)。
  • @Djent 我怀疑问题在于将复杂的 python 类型作为信号参数传递(与整数和字符串等基本类型相反)。如果是这样,一种可能的解决方法可能是将参数作为 json 字符串发送 - 或者只是尝试重写您的代码,这样就不需要发送像 listdict 这样的类型。

标签: python python-3.x segmentation-fault pyside


【解决方案1】:

首先:Segmentation fault 对开发人员来说是一个复杂的问题。为了有效地处理它,请使用fault handler。它是 Python v.3.x 的一部分,但您可以使用 pip 在 Python v.2.x 中安装它。但有时您最好使用事件过滤器注册 - 用于跟踪信号事件的小部件。这是一个鼠标的例子(只是看看它的样子):

# IT IS JUST AN EXAMPLE (NOT A SOLUTION)

def eventFilter(self, source, event):
    if event.type() == QEvent.MouseButtonPress:
        if source == self.txtEditor :
            pos=event.pos()
            cursor=self.txtEditor.cursorForPosition(pos)
            cursor.select(QTextCursor.WordUnderCursor)
            txtClicked=cursor.selectedText()
            self.testCommand(str(txtClicked))
    return QMainWindow.eventFilter(self, source, event)

第二:你可能会使用The Python Debugger模块:

python -m pdb yourScript.py

第三:涉及线程(但你说不涉及线程)。

shutdown (exit) can hang or segfault with daemon threads running

【讨论】:

  • 我正在使用 faulthandler,它告诉我分段错误是由 PublisherSignal 对象的实例化引起的。不知道为什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多