Skip to content

Commit 8e7af17

Browse files
committed
Let MovieFileWriter save the files in a new dir
1 parent 9f74ea7 commit 8e7af17

File tree

1 file changed

+29
-12
lines changed

1 file changed

+29
-12
lines changed

lib/matplotlib/animation.py

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import subprocess
3030
import sys
3131
from tempfile import TemporaryDirectory
32+
import tempfile
3233
import uuid
3334

3435
import numpy as np
@@ -424,7 +425,7 @@ def __init__(self, *args, **kwargs):
424425
self.frame_format = rcParams['animation.frame_format']
425426

426427
def setup(self, fig, outfile, dpi=None, frame_prefix='_tmp',
427-
clear_temp=True):
428+
clear_temp=True, frame_dir=None):
428429
'''Perform setup for writing the movie file.
429430
430431
Parameters
@@ -444,7 +445,9 @@ def setup(self, fig, outfile, dpi=None, frame_prefix='_tmp',
444445
If the temporary files should be deleted after stitching
445446
the final result. Setting this to ``False`` can be useful for
446447
debugging. Defaults to ``True``.
447-
448+
frame_dir : str or None, optional
449+
Directory where the temporary files are saved. None means that a
450+
new directory is created.
448451
'''
449452
self.fig = fig
450453
self.outfile = outfile
@@ -453,8 +456,18 @@ def setup(self, fig, outfile, dpi=None, frame_prefix='_tmp',
453456
self.dpi = dpi
454457
self._adjust_frame_size()
455458

459+
self.created_dir = None
460+
if frame_dir is None:
461+
tempfile.tempdir = ''
462+
frame_dir = tempfile.mkdtemp()
463+
self.created_dir = frame_dir
464+
elif not os.path.exists(frame_dir) and frame_dir:
465+
os.makedirs(frame_dir)
466+
self.created_dir = frame_dir
467+
468+
self.temp_prefix = os.path.join(frame_dir, frame_prefix)
469+
456470
self.clear_temp = clear_temp
457-
self.temp_prefix = frame_prefix
458471
self._frame_counter = 0 # used for generating sequential file names
459472
self._temp_names = list()
460473
self.fname_format_str = '%s%%07d.%s'
@@ -542,7 +555,11 @@ def cleanup(self):
542555
self._temp_names)
543556
for fname in self._temp_names:
544557
os.remove(fname)
545-
558+
if self.created_dir:
559+
try:
560+
os.rmdir(self.created_dir)
561+
except OSError:
562+
pass
546563

547564
@writers.register('pillow')
548565
class PillowWriter(MovieWriter):
@@ -597,7 +614,9 @@ class FFMpegBase(object):
597614

598615
@property
599616
def output_args(self):
600-
args = ['-vcodec', self.codec]
617+
args = []
618+
if self.codec:
619+
args.extend(['-vcodec', self.codec])
601620
# For h264, the default format is yuv444p, which is not compatible
602621
# with quicktime (and others). Specifying yuv420p fixes playback on
603622
# iOS,as well as HTML5 video in firefox and safari (on both Win and
@@ -665,8 +684,7 @@ def _args(self):
665684
# Returns the command line parameters for subprocess to use
666685
# ffmpeg to create a movie using a collection of temp images
667686
return [self.bin_path(), '-r', str(self.fps),
668-
'-i', self._base_temp_name(),
669-
'-vframes', str(self._frame_counter)] + self.output_args
687+
'-i', self._base_temp_name()] + self.output_args
670688

671689

672690
# Base class of avconv information. AVConv has identical arguments to FFMpeg.
@@ -855,13 +873,12 @@ def setup(self, fig, outfile, dpi, frame_dir=None):
855873
if not self.embed_frames:
856874
if frame_dir is None:
857875
frame_dir = root + '_frames'
858-
if not os.path.exists(frame_dir):
859-
os.makedirs(frame_dir)
860-
frame_prefix = os.path.join(frame_dir, 'frame')
861876
else:
862-
frame_prefix = None
877+
frame_dir = ''
878+
frame_prefix = 'frame'
863879

864-
super().setup(fig, outfile, dpi, frame_prefix, clear_temp=False)
880+
super().setup(fig, outfile, dpi, frame_prefix, clear_temp=False,
881+
frame_dir=frame_dir)
865882

866883
def grab_frame(self, **savefig_kwargs):
867884
if self.embed_frames:

0 commit comments

Comments
 (0)