RuntimeError: Could not open facefile

Hi,
I’m running into this RuntimeError: Could not open facefile c:\Python32\lib\site-packages\matplotlib\mpl-data\fonts\ttf\Vera.ttf; Cannot_Open_Resource when I’m trying to save out a series of *.png files in a loop. It crashes on this error after many passes through the loop and successful files get created, but then always on the same pass it does this. The full traceback is here:

File “C:\Users\E440710\Desktop\PythonTransfer\fittslaw_ThroughputCalc_AS_break.py”, line 744, in
fig.savefig(fname, transparent = True)
File “c:\Python32\lib\site-packages\matplotlib\figure.py”, line 1174, in savefig
self.canvas.print_figure(*args, **kwargs)
File “c:\Python32\lib\site-packages\matplotlib\backend_bases.py”, line 2027, in print_figure
**kwargs)
File “c:\Python32\lib\site-packages\matplotlib\backends\backend_agg.py”, line 451, in print_png
FigureCanvasAgg.draw(self)
File “c:\Python32\lib\site-packages\matplotlib\backends\backend_agg.py”, line 400, in draw
self.figure.draw(self.renderer)
File “c:\Python32\lib\site-packages\matplotlib\artist.py”, line 56, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File “c:\Python32\lib\site-packages\matplotlib\figure.py”, line 887, in draw
func(*args)
File “c:\Python32\lib\site-packages\matplotlib\artist.py”, line 56, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File “c:\Python32\lib\site-packages\matplotlib\axes.py”, line 1985, in draw
a.draw(renderer)
File “c:\Python32\lib\site-packages\matplotlib\artist.py”, line 56, in draw_wrapper
draw(artist, renderer, *args, **kwargs)
File “c:\Python32\lib\site-packages\matplotlib\axis.py”, line 1043, in draw
ticklabelBoxes, ticklabelBoxes2 = self._get_tick_bboxes(ticks_to_draw, renderer)
File “c:\Python32\lib\site-packages\matplotlib\axis.py”, line 994, in _get_tick_bboxes
extent = tick.label1.get_window_extent(renderer)
File “c:\Python32\lib\site-packages\matplotlib\text.py”, line 743, in get_window_extent
bbox, info = self._get_layout(self._renderer)
File “c:\Python32\lib\site-packages\matplotlib\text.py”, line 296, in _get_layout
ismath=False)
File “c:\Python32\lib\site-packages\matplotlib\backends\backend_agg.py”, line 182, in get_text_width_height_descent
font = self._get_agg_font(prop)
File “c:\Python32\lib\site-packages\matplotlib\backends\backend_agg.py”, line 223, in _get_agg_font
font = FT2Font(str(fname))
RuntimeError: Could not open facefile c:\Python32\lib\site-packages\matplotlib\mpl-data\fonts\ttf\Vera.ttf; Cannot_Open_Resource

I’ve tried the various fixes that have been suggested - removing the fontList.py3k.cache and even the removing the .matplotlib directory. However when I run my script that’s producing the error the directory gets recreated along with the fontList.py3k.cache which must be pointing to the wrong path?

When I check the path c:\Python32\lib\site-packages\matplotlib\mpl-data\fonts\ttf\Vera.ttf where matplotlib is looking for the resource it cannot open - the Vera.ttf is there.

This only happens after many iterations through the loop that is saving out the *.png files and I have no idea why.

The relevant code from my script is here:

for p in plotData[k][“data”]:
#print(“p in plotData[k]:”,p)
a = numpy.array((loc[0],loc[1]))
b = numpy.array((p[0],p[1]))
distValue = (numpy.sqrt(numpy.sum((a-b)**2) ))/86.0 #divide by 86 because that was the ppi on the display used to collect the data
if p[2] == 1:
hit_x.append(loc[0]-p[0])

            hit_y.append(loc[1]-p[1])
           
            frame_hit_x = loc[0]-p[0]
            frame_hit_y = loc[1]-p[1]
            print("frame_x:", frame_hit_x)
            files = []
            if size == (0.25,0.25) and makeMovie:
           
                fig = plt.figure()
                print("fig:", fig)
                plt.plot(frame_hit_x,frame_hit_y,color='green',marker='o',linestyle='')
               
                plt.axis('scaled')
                plt.axis([-100,100,-100,100])
           
                fname = "subj{:g}_size{:g}_hit_x{:g}.png".format(Subject,btnSize,frame_hit_x)
                print('saving frame', fname)
                fig.savefig(fname, transparent = True)
                files.append(fname)

I’m on a Win7 64bit using python 3.2 and matplotlib version 1.2.x

Any help would be greatly appreciated!

Andy

This is a known bug on Windows where it runs out of file handles
after a while.

This commit was an attempt to fix it, but it doesn't seem to work:

https://github.com/matplotlib/matplotlib/commit/4cb2aaa87b0aa9efe7178d7510d3d091ef5206df

I think we need a Windows user/developer/expert to get to the bottom

of why file handles are not being freed to the OS.

Mike
···

http://p.sf.net/sfu/sfd2d-msazureMatplotlib-users@lists.sourceforge.nethttps://lists.sourceforge.net/lists/listinfo/matplotlib-users

Ok thank you - so one way to work around it is to just generate the files I want in batches so Windows won’t run out of file handles - but is there a way to know how many handles are available? I’m trying to animate some data and I don’t really know how many frames there are - could be thousands.

Andy

···

On Fri, Mar 23, 2012 at 3:45 PM, Michael Droettboom <mdroe@…86…> wrote:

This is a known bug on Windows where it runs out of file handles

after a while.

This commit was an attempt to fix it, but it doesn't seem to work:




[https://github.com/matplotlib/matplotlib/commit/4cb2aaa87b0aa9efe7178d7510d3d091ef5206df](https://github.com/matplotlib/matplotlib/commit/4cb2aaa87b0aa9efe7178d7510d3d091ef5206df)



I think we need a Windows user/developer/expert to get to the bottom

of why file handles are not being freed to the OS.

Mike




On 03/23/2012 04:35 PM, Andrew Smart wrote:

Hi,

  I'm running into this RuntimeError: Could not open facefile

c:\Python32\lib\site-packages\matplotlib\mpl-data\fonts\ttf\Vera.ttf;
Cannot_Open_Resource when I’m trying to save out a series of *.png
files in a loop. It crashes on this error after many passes
through the loop and successful files get created, but then always
on the same pass it does this. The full traceback is here:

    File

“C:\Users\E440710\Desktop\PythonTransfer\fittslaw_ThroughputCalc_AS_break.py”,
line 744, in

      fig.savefig(fname, transparent = True)

    File "c:\Python32\lib\site-packages\matplotlib\figure.py", line

1174, in savefig

      self.canvas.print_figure(*args, **kwargs)

    File

“c:\Python32\lib\site-packages\matplotlib\backend_bases.py”, line
2027, in print_figure

      **kwargs)

    File

“c:\Python32\lib\site-packages\matplotlib\backends\backend_agg.py”,
line 451, in print_png

      FigureCanvasAgg.draw(self)

    File

“c:\Python32\lib\site-packages\matplotlib\backends\backend_agg.py”,
line 400, in draw

      self.figure.draw(self.renderer)

    File "c:\Python32\lib\site-packages\matplotlib\artist.py", line

56, in draw_wrapper

      draw(artist, renderer, *args, **kwargs)

    File "c:\Python32\lib\site-packages\matplotlib\figure.py", line

887, in draw

      func(*args)

    File "c:\Python32\lib\site-packages\matplotlib\artist.py", line

56, in draw_wrapper

      draw(artist, renderer, *args, **kwargs)

    File "c:\Python32\lib\site-packages\matplotlib\axes.py", line

1985, in draw

      a.draw(renderer)

    File "c:\Python32\lib\site-packages\matplotlib\artist.py", line

56, in draw_wrapper

      draw(artist, renderer, *args, **kwargs)

    File "c:\Python32\lib\site-packages\matplotlib\axis.py", line

1043, in draw

      ticklabelBoxes, ticklabelBoxes2 =

self._get_tick_bboxes(ticks_to_draw, renderer)

    File "c:\Python32\lib\site-packages\matplotlib\axis.py", line

994, in _get_tick_bboxes

      extent = tick.label1.get_window_extent(renderer)

    File "c:\Python32\lib\site-packages\matplotlib\text.py", line

743, in get_window_extent

      bbox, info = self._get_layout(self._renderer)

    File "c:\Python32\lib\site-packages\matplotlib\text.py", line

296, in _get_layout

      ismath=False)

    File

“c:\Python32\lib\site-packages\matplotlib\backends\backend_agg.py”,
line 182, in get_text_width_height_descent

      font = self._get_agg_font(prop)

    File

“c:\Python32\lib\site-packages\matplotlib\backends\backend_agg.py”,
line 223, in _get_agg_font

      font = FT2Font(str(fname))

  RuntimeError: Could not open facefile

c:\Python32\lib\site-packages\matplotlib\mpl-data\fonts\ttf\Vera.ttf;
Cannot_Open_Resource

  I've tried the various fixes that have been suggested - removing

the fontList.py3k.cache and even the removing the .matplotlib
directory. However when I run my script that’s producing the error
the directory gets recreated along with the fontList.py3k.cache
which must be pointing to the wrong path?

  When I check the path

c:\Python32\lib\site-packages\matplotlib\mpl-data\fonts\ttf\Vera.ttf
where matplotlib is looking for the resource it cannot open - the
Vera.ttf is there.

  This only happens after many iterations through the loop that is

saving out the *.png files and I have no idea why.

  The relevant code from my script is here:



  for p in plotData[k]["data"]:

              #print("p in plotData[k]:",p)

              a = numpy.array((loc[0],loc[1]))

              b = numpy.array((p[0],p[1]))

              distValue = (numpy.sqrt(numpy.sum((a-b)**2) ))/86.0

#divide by 86 because that was the ppi on the display used to
collect the data

              if p[2] == 1:

                  hit_x.append(loc[0]-p[0])

                 

                  hit_y.append(loc[1]-p[1])

                 

                  frame_hit_x = loc[0]-p[0]

                  frame_hit_y = loc[1]-p[1]

                  print("frame_x:", frame_hit_x)

                  files = []

                  if size == (0.25,0.25) and makeMovie:

                 

                      fig = plt.figure()

                      print("fig:", fig)

plt.plot(frame_hit_x,frame_hit_y,color=‘green’,marker=‘o’,linestyle=‘’)

                      plt.axis('scaled')

                      plt.axis([-100,100,-100,100])

                 

                      fname =

“subj{:g}_size{:g}_hit_x{:g}.png”.format(Subject,btnSize,frame_hit_x)

                      print('saving frame', fname)

                      fig.savefig(fname, transparent = True)

                      files.append(fname)



  I'm on a Win7 64bit using python 3.2 and matplotlib version 1.2.x



  Any help would be greatly appreciated!



  Andy
------------------------------------------------------------------------------
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here [http://p.sf.net/sfu/sfd2d-msazure](http://p.sf.net/sfu/sfd2d-msazure)
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
[https://lists.sourceforge.net/lists/listinfo/matplotlib-users](https://lists.sourceforge.net/lists/listinfo/matplotlib-users)

This SF email is sponsosred by:

Try Windows Azure free for 90 days Click Here

http://p.sf.net/sfu/sfd2d-msazure


Matplotlib-users mailing list

Matplotlib-users@lists.sourceforge.net

https://lists.sourceforge.net/lists/listinfo/matplotlib-users

I wonder if the solution is as simple as doing font caching at the class level rather than instance level. Andrew, could you try editing matplotlib/backends/backend_agg.py and replace

class RendererAgg(RendererBase):

“”"

The renderer handles all the drawing primitives using a graphics

context instance that controls the colors/styles

“”"

debug=1

def init(self, width, height, dpi):

if debug: verbose.report(‘RendererAgg.init’, ‘debug-annoying’)

RendererBase.init(self)

self.texd = maxdict(50) # a cache of tex image rasters

self._fontd = maxdict(50)

with

class RendererAgg(RendererBase):

“”"

The renderer handles all the drawing primitives using a graphics

context instance that controls the colors/styles

“”"

debug=1

_fontd = maxdict(50)

texd = maxdict(50) # a cache of tex image rasters

def init(self, width, height, dpi):

if debug: verbose.report(‘RendererAgg.init’, ‘debug-annoying’)

RendererBase.init(self)

Does anyone see an issue with doing this caching at the class level? If this works, we should have many fewer font files parsed.

w/o modifying the src code, a related way to test this idea is to reuse the same figure instance and clear it at the start of the loop. Ie, rather than

for i in range(N):

fig = plt.figure()

…plot_something

fig.savefig(…)

do

fig = plt.figure()

for i in range(N):

fig.clf()

…plot_something

fig.savefig(…)

I would try the latter first, and if that works I would appreciate it if you test the src code modification unless someone chimes in and tells us that is a really bad idea.

JDH

···

On Fri, Mar 23, 2012 at 3:35 PM, Andrew Smart <andrew.johnsmart@…287…> wrote:

Hi,
I’m running into this RuntimeError: Could not open facefile c:\Python32\lib\site-packages\matplotlib\mpl-data\fonts\ttf\Vera.ttf; Cannot_Open_Resource when I’m trying to save out a series of *.png files in a loop. It crashes on this error after many passes through the loop and successful files get created, but then always on the same pass it does this. The full traceback is here: