Python “变得不稳定”;无效信号签名“;PySide QWeb页面中的错误
我正在使用PySide创建一个自动加载网页和创建屏幕截图的应用程序(不,我不能使用现有的解决方案之一)。应用程序的一部分获取URL列表,并使用新的QWebPage对象依次加载每个URL。加载页面后,将拍摄屏幕截图并删除QWebPage对象 偶尔,如果运行次数足够多,我会从PySide收到以下错误,作为RuntimeError异常:Python “变得不稳定”;无效信号签名“;PySide QWeb页面中的错误,python,qt4,pyqt4,pyside,qwebpage,Python,Qt4,Pyqt4,Pyside,Qwebpage,我正在使用PySide创建一个自动加载网页和创建屏幕截图的应用程序(不,我不能使用现有的解决方案之一)。应用程序的一部分获取URL列表,并使用新的QWebPage对象依次加载每个URL。加载页面后,将拍摄屏幕截图并删除QWebPage对象 偶尔,如果运行次数足够多,我会从PySide收到以下错误,作为RuntimeError异常: Invalid Signal signature: loadStarted() Failed to connect signal loadStarted(). 第一
Invalid Signal signature: loadStarted()
Failed to connect signal loadStarted().
第一行打印到STDERR(可能是Qt?),第二行是Python异常
loadStarted()是内置的QWebPage信号,不是我创建的。这种方法90%的时间都有效,我不知道是什么原因导致它偶尔失败
老实说,这个应用在设计上是非常不寻常的,因为它将PySide/Qt连接到一个uWSGI服务的web应用程序中——这意味着,例如,我没有使用QApplicationEvent循环,而是为每个页面加载使用一个本地事件循环。我对Qt或Python都没有经验,所以我可能犯了很多错误,但我不知道这些错误是什么
我想这可能和这篇文章有关,但我不确定
有没有关于下一步去哪里的建议
更新:信号通过以下代码连接:
class MyWebPage(QWebPage):
def __init__(self, parent=None):
super(MyWebPage, self).__init__(parent)
self.loadStarted.connect(self.started)
self.loadFinished[bool].connect(self.finished)
MyWebPage对象创建为不同单个QObject实例的子对象,该实例在进程关闭之前不会被删除。完成后,通过调用page.deleteLater()将其删除。由于我正在运行一个本地事件循环,因此我通过调用以下命令,在退出本地事件循环后触发延迟删除:
# self.eventLoop is the local event loop, which at this stage is not running
self.eventLoop.processEvents()
# self.app is the QApplication instance
self.app.sendPostedEvents(None, QEvent.DeferredDelete)
我也有同样的问题(我每隔一段时间就会遇到这些错误,但我无法始终如一地重现)。我认为您可能是对的,当您尝试将信号连接到方法时,它与不存在的方法有关-为了测试这一点,我将.connect调用放在一个单独的方法中,错误消失了。例如: 编辑: (几个小时后)我想我说得太快了——我又犯了错误 更新: (几周后) 我经常使用语法,有时甚至会出现运行时错误(可能是在PySide?)。我仍然不能完全确定原因,但由于错误的发生不一致,您可能可以这样强制:
class MyWebPage(QWebPage):
def __init__(self, parent=None):
super(MyWebPage, self).__init__(parent)
success = False
while not success:
try:
success = self.loadStarted.connect(self.started)
except RuntimeError:
success = False
success = False
while not success:
try:
success = self.loadFinished[bool].connect(self.finished)
except RuntimeError:
success = False
如果你真的想确保安全,你可以保留一个循环计数器,如果信号在某个阈值之前没有正确连接,你可以让程序崩溃。我也遇到了同样的问题(我偶尔会遇到这些错误,但我无法始终如一地重现它)。我认为您可能是对的,当您尝试将信号连接到方法时,它与不存在的方法有关-为了测试这一点,我将.connect调用放在一个单独的方法中,错误消失了。例如: 编辑: (几个小时后)我想我说得太快了——我又犯了错误 更新: (几周后) 我经常使用语法,有时甚至会出现运行时错误(可能是在PySide?)。我仍然不能完全确定原因,但由于错误的发生不一致,您可能可以这样强制:
class MyWebPage(QWebPage):
def __init__(self, parent=None):
super(MyWebPage, self).__init__(parent)
success = False
while not success:
try:
success = self.loadStarted.connect(self.started)
except RuntimeError:
success = False
success = False
while not success:
try:
success = self.loadFinished[bool].connect(self.finished)
except RuntimeError:
success = False
如果你真的想确保安全,你可以保留一个循环计数器,如果信号在某个阈值之前没有正确连接,你就可以使程序崩溃。无论如何,在我升级到PySide 1.2.1之后,这个问题和其他问题最终得到了妥善解决 无论如何,在我升级到PySide 1.2.1之后,这个问题和其他问题最终得到了体面的解决 信号是如何连接的?您使用什么代码来确保正确删除网页对象?你试过创建一个简化的测试用例来重现这个问题吗?我试过创建一个简化的测试用例,但到目前为止还没有,这是很难重现的。我已经用一些可能有用的信息更新了这个问题。你是否碰巧有任何多线程正在进行?没有我发起的多线程-只有可能在Qt/Qwebkit内部发生的事情信号是如何连接的?您使用什么代码来确保正确删除网页对象?你试过创建一个简化的测试用例来重现这个问题吗?我试过创建一个简化的测试用例,但到目前为止还没有,这是很难重现的。我已经用一些可能有用的信息更新了这个问题。你是否碰巧有任何多线程正在进行?没有我发起的多线程-只有Qt/QWebKit内部可能发生的事情