SourceForge logo
SourceForge logo
Menu

matplotlib-users

From: Mads I. <mad...@gm...> - 2013年01月29日 22:12:47
Attachments: plot.py
Hi,
I spend some time writing up the question below on Stackoverflow which 
immediately was closed as a duplicate of other posts. To my best 
knowledge, these posts did not answer my questions - so I'll try my luck 
here instead:
I am using the qt backengine for setting up a QWidget that embeds a 
matplotlib scene. When the widget is closed it appears that many of the 
matplotlib objects that were part of the plot still are alive in Python 
space.
My question is basically the following: What actions should I take to 
clean up the figure and axes objects etc. that were part of the plot 
widget? The qt backend comes with a figure manager, but it appears a 
little unclear how it should be used.
I have attached a small unit test example that sets up a plot. When the 
plot appears, just close it, and the test will garbage collects the 
plot, and then display info of the matplotlib objects that are still 
alive in Python space. Clearly both the path of the plot, and several 
Bbox objects are still referenced.
Our current unit test suite contains almost 10000 GUI tests and its 
imperative that proper object space clean up is done after each test. 
Any help is much appreciated.
Best regards,
Mads
-- 
+-----------------------------------------------------+
| Mads Ipsen |
+----------------------+------------------------------+
| Gåsebæksvej 7, 4. tv | |
| DK-2500 Valby | phone: +45-29716388 |
| Denmark | email: mad...@gm... |
+----------------------+------------------------------+
From: Benjamin R. <ben...@ou...> - 2013年01月30日 16:03:42
On Tue, Jan 29, 2013 at 5:12 PM, Mads Ipsen <mad...@gm...> wrote:
> Hi,
>
> I spend some time writing up the question below on Stackoverflow which
> immediately was closed as a duplicate of other posts. To my best knowledge,
> these posts did not answer my questions - so I'll try my luck here instead:
>
> I am using the qt backengine for setting up a QWidget that embeds a
> matplotlib scene. When the widget is closed it appears that many of the
> matplotlib objects that were part of the plot still are alive in Python
> space.
>
> My question is basically the following: What actions should I take to
> clean up the figure and axes objects etc. that were part of the plot
> widget? The qt backend comes with a figure manager, but it appears a little
> unclear how it should be used.
>
> I have attached a small unit test example that sets up a plot. When the
> plot appears, just close it, and the test will garbage collects the plot,
> and then display info of the matplotlib objects that are still alive in
> Python space. Clearly both the path of the plot, and several Bbox objects
> are still referenced.
>
> Our current unit test suite contains almost 10000 GUI tests and its
> imperative that proper object space clean up is done after each test. Any
> help is much appreciated.
>
> Best regards,
>
> Mads
>
>
Would "fig.clf()" do what you need?
Ben Root
From: Mads I. <mad...@gm...> - 2013年01月30日 18:46:30
On 01/30/2013 05:03 PM, Benjamin Root wrote:
>
>
> On Tue, Jan 29, 2013 at 5:12 PM, Mads Ipsen <mad...@gm... 
> <mailto:mad...@gm...>> wrote:
>
> Hi,
>
> I spend some time writing up the question below on Stackoverflow
> which immediately was closed as a duplicate of other posts. To my
> best knowledge, these posts did not answer my questions - so I'll
> try my luck here instead:
>
> I am using the qt backengine for setting up a QWidget that embeds
> a matplotlib scene. When the widget is closed it appears that many
> of the matplotlib objects that were part of the plot still are
> alive in Python space.
>
> My question is basically the following: What actions should I take
> to clean up the figure and axes objects etc. that were part of the
> plot widget? The qt backend comes with a figure manager, but it
> appears a little unclear how it should be used.
>
> I have attached a small unit test example that sets up a plot.
> When the plot appears, just close it, and the test will garbage
> collects the plot, and then display info of the matplotlib objects
> that are still alive in Python space. Clearly both the path of the
> plot, and several Bbox objects are still referenced.
>
> Our current unit test suite contains almost 10000 GUI tests and
> its imperative that proper object space clean up is done after
> each test. Any help is much appreciated.
>
> Best regards,
>
> Mads
>
>
> Would "fig.clf()" do what you need?
>
> Ben Root
>
Thanks for the feedback.
The trick is to get this done automatically when the widget is closed. 
If you look in backend_qt4.py in the constructor of FigureCanvasQT 
you'll find
 QtCore.QObject.connect(self, QtCore.SIGNAL('destroyed()'), 
self.close_event)
which should perform the steps below when close_event is called
 event = CloseEvent(s, self, guiEvent=guiEvent)
 self.callbacks.process(s, event)
If I insert print statements, the signal is ignored with matplotlib 
1.1.0, but called with 1.2.0 (which uses a lambda function in the above 
connection).But inspecting pythons objects after the close() method is 
called on the widget, it seems that - at least - the paths associated 
with plot actually still exist.
So I'm just a bit worried if there already is existing functionality in 
the FigureCanvasQTAgg object that can do these things for me. And if so, 
how to use them?
Best regards,
Mads
-- 
+-----------------------------------------------------+
| Mads Ipsen |
+----------------------+------------------------------+
| Gåsebæksvej 7, 4. tv | |
| DK-2500 Valby | phone: +45-29716388 |
| Denmark | email: mad...@gm... |
+----------------------+------------------------------+
From: Benjamin R. <ben...@ou...> - 2013年01月30日 19:03:07
On Wed, Jan 30, 2013 at 1:46 PM, Mads Ipsen <mad...@gm...> wrote:
> On 01/30/2013 05:03 PM, Benjamin Root wrote:
>
>
>
> On Tue, Jan 29, 2013 at 5:12 PM, Mads Ipsen <mad...@gm...> wrote:
>
>> Hi,
>>
>> I spend some time writing up the question below on Stackoverflow which
>> immediately was closed as a duplicate of other posts. To my best knowledge,
>> these posts did not answer my questions - so I'll try my luck here instead:
>>
>> I am using the qt backengine for setting up a QWidget that embeds a
>> matplotlib scene. When the widget is closed it appears that many of the
>> matplotlib objects that were part of the plot still are alive in Python
>> space.
>>
>> My question is basically the following: What actions should I take to
>> clean up the figure and axes objects etc. that were part of the plot
>> widget? The qt backend comes with a figure manager, but it appears a little
>> unclear how it should be used.
>>
>> I have attached a small unit test example that sets up a plot. When the
>> plot appears, just close it, and the test will garbage collects the plot,
>> and then display info of the matplotlib objects that are still alive in
>> Python space. Clearly both the path of the plot, and several Bbox objects
>> are still referenced.
>>
>> Our current unit test suite contains almost 10000 GUI tests and its
>> imperative that proper object space clean up is done after each test. Any
>> help is much appreciated.
>>
>> Best regards,
>>
>> Mads
>>
>
> Would "fig.clf()" do what you need?
>
> Ben Root
>
> Thanks for the feedback.
>
> The trick is to get this done automatically when the widget is closed. If
> you look in backend_qt4.py in the constructor of FigureCanvasQT you'll find
>
> QtCore.QObject.connect(self, QtCore.SIGNAL('destroyed()'),
> self.close_event)
>
> which should perform the steps below when close_event is called
>
> event = CloseEvent(s, self, guiEvent=guiEvent)
> self.callbacks.process(s, event)
>
> If I insert print statements, the signal is ignored with matplotlib 1.1.0,
> but called with 1.2.0 (which uses a lambda function in the above
> connection). But inspecting pythons objects after the close() method is
> called on the widget, it seems that - at least - the paths associated with
> plot actually still exist.
>
> So I'm just a bit worried if there already is existing functionality in
> the FigureCanvasQTAgg object that can do these things for me. And if so,
> how to use them?
>
> Best regards,
>
> Mads
>
>
Actually, now I am starting to recall a bug fix that came shortly after the
1.2.0 release related to properly setting up the destruction signal of the
QT figure object. Could you test your code-base with the maintenance
branch (1.2.x)? or master?
Cheers!
Ben Root
From: Mads I. <mad...@gm...> - 2013年01月31日 08:04:25
On 01/30/2013 08:02 PM, Benjamin Root wrote:
>
>
> On Wed, Jan 30, 2013 at 1:46 PM, Mads Ipsen <mad...@gm... 
> <mailto:mad...@gm...>> wrote:
>
> On 01/30/2013 05:03 PM, Benjamin Root wrote:
>>
>>
>> On Tue, Jan 29, 2013 at 5:12 PM, Mads Ipsen <mad...@gm...
>> <mailto:mad...@gm...>> wrote:
>>
>> Hi,
>>
>> I spend some time writing up the question below on
>> Stackoverflow which immediately was closed as a duplicate of
>> other posts. To my best knowledge, these posts did not answer
>> my questions - so I'll try my luck here instead:
>>
>> I am using the qt backengine for setting up a QWidget that
>> embeds a matplotlib scene. When the widget is closed it
>> appears that many of the matplotlib objects that were part of
>> the plot still are alive in Python space.
>>
>> My question is basically the following: What actions should I
>> take to clean up the figure and axes objects etc. that were
>> part of the plot widget? The qt backend comes with a figure
>> manager, but it appears a little unclear how it should be used.
>>
>> I have attached a small unit test example that sets up a
>> plot. When the plot appears, just close it, and the test will
>> garbage collects the plot, and then display info of the
>> matplotlib objects that are still alive in Python space.
>> Clearly both the path of the plot, and several Bbox objects
>> are still referenced.
>>
>> Our current unit test suite contains almost 10000 GUI tests
>> and its imperative that proper object space clean up is done
>> after each test. Any help is much appreciated.
>>
>> Best regards,
>>
>> Mads
>>
>>
>> Would "fig.clf()" do what you need?
>>
>> Ben Root
>>
> Thanks for the feedback.
>
> The trick is to get this done automatically when the widget is
> closed. If you look in backend_qt4.py in the constructor of
> FigureCanvasQT you'll find
>
> QtCore.QObject.connect(self, QtCore.SIGNAL('destroyed()'),
> self.close_event)
>
> which should perform the steps below when close_event is called
>
> event = CloseEvent(s, self, guiEvent=guiEvent)
> self.callbacks.process(s, event)
>
> If I insert print statements, the signal is ignored with
> matplotlib 1.1.0, but called with 1.2.0 (which uses a lambda
> function in the above connection).But inspecting pythons objects
> after the close() method is called on the widget, it seems that -
> at least - the paths associated with plot actually still exist.
>
> So I'm just a bit worried if there already is existing
> functionality in the FigureCanvasQTAgg object that can do these
> things for me. And if so, how to use them?
>
> Best regards,
>
> Mads
>
>
> Actually, now I am starting to recall a bug fix that came shortly 
> after the 1.2.0 release related to properly setting up the destruction 
> signal of the QT figure object. Could you test your code-base with 
> the maintenance branch (1.2.x)? or master?
>
> Cheers!
> Ben Root
>
Hi,
I attach log files from running my setup 'plot.py' with 1.1.0, 1.2.0, 
and master. To my judgement - if an automated memory clean-up is handled 
by the FigureCanvasQTAgg class - I must be abusing the usage of the 
class, since all logs still show the presence of paths, labels, bbox's, etc.
Also notice that log-1.2.0 show the presence of a path with hundreds of 
data points, which are not present in the other logs.
Best regards,
Mads
-- 
+-----------------------------------------------------+
| Mads Ipsen |
+----------------------+------------------------------+
| Gåsebæksvej 7, 4. tv | |
| DK-2500 Valby | phone: +45-29716388 |
| Denmark | email: mad...@gm... |
+----------------------+------------------------------+
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.
Thanks for helping keep SourceForge clean.
X





Briefly describe the problem (required):
Upload screenshot of ad (required):
Select a file, or drag & drop file here.
Screenshot instructions:

Click URL instructions:
Right-click on the ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)

More information about our ad policies

Ad destination/click URL:

AltStyle によって変換されたページ (->オリジナル) /