[PyQt] segmentation faults common when using QWebView

Hans-Peter Jansen hpj at urpla.net
Mon Nov 29 17:26:27 GMT 2010


On Monday 29 November 2010, 16:54:42 Brandon Craig Rhodes wrote:
> I think that there is a bright future in using PyQt4 with a QWebView
> object for writing basic web tests, and for web automation.  My early
> experiments suggest that it is a much simpler and faster solution,
> when one needs web page browsing with JavaScript enabled, than a
> heavyweight technique like running and remotely controlling a
> separate browser process.
>
> But though my first few page loads and clicks went well, I quickly
> found that sites of any complexity would cause my Python script to
> crash with a segmentation fault.  Many of my early examples were
> non-deterministic - the script would sometimes crash, but sometimes
> succeed - but I have now found a test script which always crashes,
> and that therefore might serve as a good example of this bug here on
> the mailing list.
>
> The script is attached to this email.  Its output when I run it
> against the PyQt4 shipped with Ubuntu Maverick is this:
>
> $ python2.6 qtcrash.py
> 4.7.0
> 4.7.4
> zsh: segmentation fault  python2.6 qtcrash.py
>
> When I download and install the current PyQt4 snapshot instead, this
> is the output:
>
> $ ./v/bin/python2.6 qtcrash.py
> 4.7.0
> snapshot-4.8.2-f509333f6b01
> zsh: segmentation fault  ./v/bin/python2.6 qtcrash.py
>
> Is anyone else able to reproduce this?  Where would I get started in
> tracking down why this code causes PyQt4 to produce a segmentation
> fault?  Thanks for any guidance!

From what I can see, you're missing fundamental concepts of the 
asynchronous nature of QtWebView. You should control your test flow 
with signals, instead of a timer, e.g.:

    def callback1(self):
        self.webview = QtWebKit.QWebView()
        self.webview.show()
        self.webview.load(QtCore.QUrl(
                'http://ec2-184-73-115-78.compute-1.amazonaws.com/simple/'
                ))
	# you need to wait for finishing the load
        self.webview.loadFinished.connect(self.callback1done)

    def callback1done(self):
        self.current_callback = self.callback2

This moves the issue into the next step of course, but I'm sure, you get 
the idea.

Pete


More information about the PyQt mailing list