[PyQt] Conflict between setuptools & requirements in official PyQt5 docs
elvstone at gmail.com
Tue Feb 9 07:20:00 GMT 2016
2016-02-09 5:37 GMT+01:00 Kovid Goyal <kovid at kovidgoyal.net>:
> 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()
That sounds like a good solution. I'll use it in my current project.
> That way you get both behaviors. Although, in my experience, you cannot
> avoid segfaults on exit by relying on sip.setdestroyonexit().
Have you been able to pinpoint when and why crashes happen despite
setdestroyonexit() (default in PyQt5)? I've not had any crashes on
exit myself yet. Could it be that you have orphan QObjects? (thought
that would only mean they simple don't get destroyed I guess?).
> 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.
>> PyQt mailing list PyQt at riverbankcomputing.com
> Dr. Kovid Goyal
> PyQt mailing list PyQt at riverbankcomputing.com
More information about the PyQt