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

Phil Thompson phil at riverbankcomputing.com
Mon Feb 8 17:43:36 GMT 2016

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.


More information about the PyQt mailing list