Python pyqt4 seg故障顺序应用程序启动-停止

Python pyqt4 seg故障顺序应用程序启动-停止,python,segmentation-fault,pyqt4,Python,Segmentation Fault,Pyqt4,我正在尝试使用pyqt阅读网页。我需要使用不同的URL多次调用一个方法。我目前使用的代码类似于: 然而,当我尝试时,我会遇到seg故障。欢迎任何建议 import sys from time import clock from PyQt4.QtGui import * from PyQt4.QtCore import * from PyQt4.QtWebKit import * from PyQt4.QtNetwork import * class Render(QWebPage): d

我正在尝试使用pyqt阅读网页。我需要使用不同的URL多次调用一个方法。我目前使用的代码类似于:

然而,当我尝试时,我会遇到seg故障。欢迎任何建议

import sys

from time import clock
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtWebKit import *
from PyQt4.QtNetwork import *

class Render(QWebPage):
  def __init__(self):
    self.app = QApplication(sys.argv)
    QWebPage.__init__(self)

    self.networkAccessManager().finished.connect(self.handleEnd)
    self.loadFinished.connect(self._loadFinished)

    self.mainFrame().setScrollBarPolicy(Qt.Horizontal, Qt.ScrollBarAlwaysOff)
    self.mainFrame().setScrollBarPolicy(Qt.Vertical, Qt.ScrollBarAlwaysOff)

  def loadURL(self, url):
    self.mainFrame().load(QUrl(url))
    self.app.exec_()

  def savePageImage (self, width, height, Imagefile):
    pageSize = self.mainFrame().contentsSize();
    if width == 0:
        pageWidth = pageSize.width()
    else:
        pageWidth = width
    if height == 0:
        pageHeight = pageSize.height()
    else:
        pageHeight = height

    self.setViewportSize(QSize(pageWidth, pageHeight))
    Img = QImage(self.viewportSize(), QImage.Format_ARGB32)
    painter = QPainter(Img)
    self.mainFrame().render(painter)
    painter.end()
    Img.save(Imagefile)


  def _loadFinished(self, result):
    print "load finish"
    self.frame = self.mainFrame()
    self.returnVal = result 
    self.app.quit()

  def handleEnd (self, reply):
    # get first http code and disconnect
    # could add filter to listen relevant responses
    self.httpcode = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
    self.networkAccessManager().finished.disconnect(self.handleEnd)


jsrurl = 'http://www.w3resource.com/javascript/document-alert-confirm/four.html'
badurl='something.or.other'
badhttp = 'http://eclecticself.com/test2.html'
testurl = 'http://www.nydailynews.com/entertainment/index.html'
testurl2 = 'http://www.palmbeachpost.com/'
testurl3 = 'http://www.nydailynews.com/news/politics/2011/08/03/2011-08-03_pat_buchanan_downplays_controversy_after_calling_president_obama_your_boy_to_rev.html'
url = testurl



start = clock()
r = Render()
r.loadURL(url)
html = r.frame.toHtml()
elapsed = clock() - start
print elapsed

if (r.returnVal == True):
    if (r.httpcode.toInt()[0] != 404):
        #print html.toUtf8()
        start = clock()
        r.savePageImage(1024, 0, "pageSnapshot.png")
        elapsed = clock() - start
        print elapsed
    else:
        print 'page not found'
else:
    print 'badurl'

s = Render()
s.loadURL(jsrurl)
html = s.frame.toHtml()
elapsed = clock() - start
print elapsed
if (s.returnVal == True):
    if (s.httpcode.toInt()[0] != 404):
        print html.toUtf8()
        start = clock()
        s.savePageImage(1024, 0, "pageSnapshot.png")
        elapsed = clock() - start
        print elapsed
    else:
        print 'page not found'
else:
    print 'badurl'

PyQt经常忘记保留对对象的引用。解决办法:

  • 尝试使用PyQt代替PyQt,这很容易,因为API几乎与PyQt完全相同。我会首先尝试PySide,它可能会立即解决您的问题,或者至少使其可预测且可复制

  • 尝试保留对正在使用的所有Qt对象的引用,并在处理完这些对象后删除这些引用。在转到下一个网页之前,您还可以尝试显式关闭它们或导航到“about:blank”

这通常会有帮助。如果没有,那么您需要按照上面乌德米尔的建议缩小范围。调试通常没有帮助,因为此类问题通常也与时间有关。没有输出缓冲区的日志记录通常可以帮助您更接近问题的根源


我的灵魂与你同在,这样的问题很难找到

把打印的语句放在各处,找出你到底从哪里得到的。我怀疑正在初始化QApplication。是的,找不到任何原因。尝试了PySide相同的结果。基本上想退出应用程序而不是重启应用程序