No se puede guardar la animación en matplotlib: permiso de Windows denegado

He intentado durante un día resolver esto, verificando hilos similares pero sin éxito.Stretch's Cannot save matplotlib animation with ffmpeg ayudé con errores anteriores (tenía la ruta ffmpeg incorrecta), pero seguí negando el acceso después de solucionarlo.

Mi binario ffmpeg está activadoC:\ffmpeg\bin

Una buena alternativa sería poder exportar archivos gif, pero sigo recibiendo un error ascii con imagemagick. Creo que ambos problemas están relacionados, por lo que quería resolver el ffmpeg primero.

Creo que el problema podría tener que ver con el hecho de que estoy trabajando con Canopy (en Windows 8 de 64 bits), que prácticamente hegemonizó mi variable de ruta y rompió algunas cosas en el camino (por ejemplo, no puedo abrir IDLE desde que instalé Canopy , no intenté arreglar eso todavía). A medida que solucioné las cosas, encontré al menos 3 variables de ruta distintas, todas las cuales actualicé: ruta de configuración avanzada de Windows (configurada manualmente), ruta de la consola de Windows (configurada a través de la consola con setx) y sys.path (configurada o marcada en tiempo de ejecución), agregando";C:\ffmpeg\bin", donde está efectivamente ffmpeg. Independientemente de si soluciono el problema o no, me gustaría saber cuáles de estas variables de entorno son relevantes para qué, lo encuentro muy confuso.

El código es el siguiente:

# -*- coding: utf-8 -*-
import sys
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
plt.rcParams['animation.ffmpeg_path'] = r'C:\ffmpeg\bin'
if r'C:\ffmpeg\bin' not in sys.path: sys.path.append(r'C:\ffmpeg\bin')

fig = plt.figure()
ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))
line, = ax.plot([], [], lw=2)

def init():
    line.set_data([], [])
    return line,

def animate(i):
    x = np.linspace(0, 2, 1000)
    y = np.sin(2 * np.pi * (x - 0.01 * i))
    line.set_data(x, y)
    return line,

anim = animation.FuncAnimation(fig, animate, init_func=init, frames=200, interval=20, blit=True)
plt.show()

# This case generates Windows err: Access Denied
FFwriter = animation.FFMpegWriter()
# anim.save(r'C:\basic_animation.mp4', writer = FFwriter, fps=30)

# This case generates UnicodeDecodeError:'ascii' codec can't decode byte 0xa0 in position 3
# anim.save(r'C:\animation.gif', writer='imagemagick', fps=30)

El rastreo deanim.save(r'C:\basic_animation.mp4', writer = FFwriter, fps=30):

%run "C:\Users\Yahveh\Documents\Vlad\Investigacion\animation saving.py"
---------------------------------------------------------------------------
WindowsError                              Traceback (most recent call last)
C:\Users\Yahveh\Documents\Vlad\Investigacion\animation saving.py in <module>()
     27 # This case generates Windows err: Access Denied
     28 FFwriter = animation.FFMpegWriter()
---> 29 anim.save(r'C:\basic_animation.mp4', writer = FFwriter, fps=30)
     30 
     31 # This case generates UnicodeDecodeError:'ascii' codec can't decode byte 0xa0 in position 3

C:\Users\Yahveh\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\animation.pyc in save(self, filename, writer, fps, dpi, codec, bitrate, extra_args, metadata, extra_anim, savefig_kwargs)
    759         # since GUI widgets are gone. Either need to remove extra code to
    760         # allow for this non-existant use case or find a way to make it work.
--> 761         with writer.saving(self._fig, filename, dpi):
    762             for data in zip(*[a.new_saved_frame_seq()
    763                               for a in all_anim]):

C:\Users\Yahveh\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.5.2.2785.win-x86_64\lib\contextlib.pyc in __enter__(self)
     15     def __enter__(self):
     16         try:
---> 17             return self.gen.next()
     18         except StopIteration:
     19             raise RuntimeError("generator didn't yield")

C:\Users\Yahveh\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\animation.pyc in saving(self, *args)
    184         '''
    185         # This particular sequence is what contextlib.contextmanager wants
--> 186         self.setup(*args)
    187         yield
    188         self.finish()

C:\Users\Yahveh\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\animation.pyc in setup(self, fig, outfile, dpi, *args)
    174         # Run here so that grab_frame() can write the data to a pipe. This
    175         # eliminates the need for temp files.
--> 176         self._run()
    177 
    178     @contextlib.contextmanager

C:\Users\Yahveh\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\animation.pyc in _run(self)
    202                                       stdout=output, stderr=output,
    203                                       stdin=subprocess.PIPE,
--> 204                                       creationflags=subprocess_creation_flags)
    205 
    206     def finish(self):

C:\Users\Yahveh\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.5.2.2785.win-x86_64\lib\subprocess.pyc in __init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags)
    707                                 p2cread, p2cwrite,
    708                                 c2pread, c2pwrite,
--> 709                                 errread, errwrite)
    710         except Exception:
    711             # Preserve original exception in case os.close raises.

C:\Users\Yahveh\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.5.2.2785.win-x86_64\lib\subprocess.pyc in _execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, to_close, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite)
    955                                          env,
    956                                          cwd,
--> 957                                          startupinfo)
    958             except pywintypes.error, e:
    959                 # Translate pywintypes.error to WindowsError, which is

WindowsError: [Error 5] Acceso denegado 

El rastreo deanim.save(r'C:\animation.gif', writer='imagemagick', fps=30):

In [8]: %run "C:\Users\Yahveh\Documents\Vlad\Investigacion\animation saving.py"
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
C:\Users\Yahveh\Documents\Vlad\Investigacion\animation saving.py in <module>()
     30 
     31 # This case generates UnicodeDecodeError:'ascii' codec can't decode byte 0xa0 in position 3
---> 32 anim.save(r'C:\animation.gif', writer='imagemagick', fps=30)

C:\Users\Yahveh\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\animation.pyc in save(self, filename, writer, fps, dpi, codec, bitrate, extra_args, metadata, extra_anim, savefig_kwargs)
    765                     # TODO: Need to see if turning off blit is really necessary
    766                     anim._draw_next_frame(d, blit=False)
--> 767                 writer.grab_frame(**savefig_kwargs)
    768 
    769         # Reconnect signal for first draw if necessary

C:\Users\Yahveh\AppData\Local\Enthought\Canopy\User\lib\site-packages\matplotlib\animation.pyc in grab_frame(self, **savefig_kwargs)
    225             verbose.report('MovieWriter -- Error '
    226                            'running proc:\n%s\n%s' % (out,
--> 227                                                       err), level='helpful')
    228             raise
    229 

UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 3: ordinal not in range(128) 

Los miré por un momento.

¡Gracias por tu tiempo!

ACTUALIZAR: Seguí los pasos enesta publicación para otorgar acceso tanto a C: \ ffmpeg como a la carpeta de destino, pero no hubo suerte :(

Respuestas a la pregunta(2)

Su respuesta a la pregunta