Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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 “变得不稳定”;无效信号签名“;PySide QWeb页面中的错误_Python_Qt4_Pyqt4_Pyside_Qwebpage - Fatal编程技术网

Python “变得不稳定”;无效信号签名“;PySide QWeb页面中的错误

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(). 第一

我正在使用PySide创建一个自动加载网页和创建屏幕截图的应用程序(不,我不能使用现有的解决方案之一)。应用程序的一部分获取URL列表,并使用新的QWebPage对象依次加载每个URL。加载页面后,将拍摄屏幕截图并删除QWebPage对象

偶尔,如果运行次数足够多,我会从PySide收到以下错误,作为RuntimeError异常:

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内部可能发生的事情