[PyQt] Conflict between setuptools & requirements in official PyQt5 docs

Kovid Goyal kovid at kovidgoyal.net
Tue Feb 9 04:37:15 GMT 2016


Surely, the advice should be to keep a module level reference to the
application global rather than to run code at module level. Like this:

app = None

def main():
    global app
    app = QApplication([])
    app.exec_()

That way you get both behaviors. Although, in my experience, you cannot
avoid segfaults on exit by relying on sip.setdestroyonexit().

Kovid.

On Mon, Feb 08, 2016 at 05:43:36PM +0000, Phil Thompson wrote:
> On 8 Feb 2016, at 5:01 pm, Damon Lynch <damonlynch at gmail.com> wrote:
> > 
> > The PyQt5 docs explicitly say not to put the application startup logic in a function e.g. main():
> > 
> > http://pyqt.sourceforge.net/Docs/PyQt5/pyqt4_differences.html#object-destruction-on-exit
> > 
> > Whereas setuptools and its entry_points feature requires the startup logic be in a function.
> > 
> > From looking through a bunch of projects on github, I see that the great majority simply ignore the official PyQt5 advice, and have a main() type function with all their startup logic. 
> > 
> > However at least one project takes the approach of deleting PyQt objects before exit (drawing on an insight offered by Dr. Koval):
> > 
> > def main():
> >     import sys
> >     app = QtGui.QApplication(sys.argv)
> >     window = DataViz()
> >     window.show()
> >     app.exec_()
> >     # fixed segfaults at exit:
> >     # http://python.6.x6.nabble.com/Application-crash-on-exit-under-Linux-td5067510.html
> >     del window
> >     del app   
> >     sys.exit(0)
> > 
> > if __name__ == '__main__':
> >     main()
> > 
> > 
> > Source: https://github.com/subhacom/dataviz/blob/e62a591149750e5e5d21f13b4dfee28409a3d683/dataviz/dataviz.py
> > 
> > Is this approach guaranteed to work as well as the approach specified in the official docs?
> 
> That's PyQt4 code.
> 
> The advice is contradictory - but it has to be. pyqtdeploy uses setuptools and has a main() entry point. For most of the time it's not a problem - so you are unlucky to hit it, rather than being lucky not to. However the worse aspect of it is that is can occur apparently randomly (ie. it can be very difficult to identify what change to the application triggered it).
> 
> I've toned down the section in the docs so that it says "try to avoid" rather than "don't".
> 
> The other bit of advice is to try and make sure there are only two global QObjects in your application - the QApplication and the top-level GUI widget. Try and make sure that every other QObject has an appropriate parent. That way Qt should destroy things in a safe order.
> 
> Phil
> _______________________________________________
> PyQt mailing list    PyQt at riverbankcomputing.com
> https://www.riverbankcomputing.com/mailman/listinfo/pyqt

-- 
_____________________________________

Dr. Kovid Goyal 
http://www.kovidgoyal.net
http://calibre-ebook.com
_____________________________________


More information about the PyQt mailing list