[PyQt] Conflict between setuptools & requirements in official PyQt5 docs
Jones, Bryan
bjones at ece.msstate.edu
Fri Feb 12 18:00:31 GMT 2016
Phil,
I'm always impressed with you quick turnaround. Thanks for the fix!
Bryan
On Wed, Feb 10, 2016 at 4:38 PM, Phil Thompson <phil at riverbankcomputing.com>
wrote:
>
> > On 10 Feb 2016, at 8:57 pm, Jones, Bryan <bjones at ece.msstate.edu> wrote:
> >
> > Thanks for the feedback. The first two crashes (quickCrash and
> slowCrash) were, as you say, fairly obvious programmer errors. It would be
> nice if this would emit some sort of error ("QApplication destroyed;
> terminating application") with a backtrace.
> >
> > The third case is more interesting -- the cause is more subtle and more
> likely (IMHO) to occur in "real" code. Here's a second pass at it, with a
> bit of cleanup. It looks like I've created a cycle between the QWidget
> (whose destroyed signal refers to foo) and the function foo (which retains
> a reference to the QWidget). When Python breaks the cycle during its
> garbage collection, it finalizes the QWidget, which invokes foo, which
> causes a crash. The QApplication instance, however, is still valid and has
> not been either finalized (that is, Python's __del__) or destroyed (the C++
> destructor). Any thoughts?
> >
> > import sys
> > import os
> > import platform
> > import gc
> > import sip
> > from PyQt5.QtWidgets import QApplication, QWidget
> > from PyQt5.QtCore import QT_VERSION_STR
> > from PyQt5.Qt import PYQT_VERSION_STR
> >
> > app = None
> >
> > DEBUG = False
> >
> > if DEBUG:
> > def printDestroyed(qObject):
> > qObjectStr = str(qObject)
> > def destroyed():
> > print('destroyed {}'.format(qObjectStr))
> > qObject.destroyed.connect(destroyed)
> >
> > class QApplicationF(QApplication):
> > def __del__(self):
> > print('finalized {}'.format(self))
> >
> > class QWidgetF(QWidget):
> > def __del__(self):
> > print('finalized {}'.format(self))
> >
> > def checkLeaks():
> > for o in gc.get_objects():
> > try:
> > if not sip.isdeleted(o):
> > sip.dump(o)
> > except TypeError:
> > pass
> >
> > else:
> > def printDestroyed(_): pass
> > QApplicationF = QApplication
> > QWidgetF = QWidget
> > def checkLeaks(): pass
> >
> > def foo(x):
> > return lambda: x
> >
> > def qtMain(doCrash):
> > global app
> > app = QApplicationF(sys.argv)
> > printDestroyed(app)
> >
> > w = QWidgetF()
> > printDestroyed(w)
> >
> > param = w if doCrash else 1
> > w.destroyed.connect(foo(param))
> >
> > def gcCrash(createCycle, doCollect):
> > qtMain(createCycle)
> > checkLeaks()
> > gc.collect(doCollect)
> >
> > if __name__ == '__main__':
> > # Both must be True for a crash.
> > gcCrash(True, True)
>
> Attached is a patch (also in tonight's PyQt5 snapshot but you'll need a
> SIP snapshot as well) that will stop this particular crash.
>
> Note that as soon as you start using __del__ the behaviour of the garbage
> collector changes.
>
> Phil
>
>
--
Bryan A. Jones, Ph.D.
Associate Professor
Department of Electrical and Computer Engineering
231 Simrall / PO Box 9571
Mississippi State University
Mississippi state, MS 39762
http://www.ece.msstate.edu/~bjones
bjones AT ece DOT msstate DOT edu
voice 662-325-3149
fax 662-325-2298
Our Master, Jesus Christ, is on his way. He'll show up right on
time, his arrival guaranteed by the Blessed and Undisputed Ruler,
High King, High God.
- 1 Tim. 6:14b-15 (The Message)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20160212/014568cc/attachment-0001.html>
More information about the PyQt
mailing list