Невозможно сохранить анимацию в matplotlib: разрешение Windows запрещено

Я пробовал целый день, чтобы разобраться в этом, проверяя похожие темы, но безуспешно. Stretch's Не удается сохранить анимацию matplotlib с ffmpeg, помогали с предыдущими ошибками (у меня был неправильный путь ffmpeg), но я продолжал получать Access denied после его исправления.

Мой двоичный файл ffmpeg находится на C:\ffmpeg\bin

Хорошей альтернативой было бы возможность экспортировать gif-файлы, но я продолжаю получать ошибку ascii с помощью imagemagick. Я думаю, что обе проблемы связаны, поэтому я сначала хотел разобраться в ffmpeg.

Я думаю, что проблема может быть связана с тем фактом, что я работаю с Canopy (в Windows 8 64bit), который довольно сильно гегемонизировал мою переменную пути и сломал некоторые вещи на этом пути (например, я не могу открыть IDLE, так как я установил Canopy , пока не пытался это исправить). Поскольку я исправлял вещи по пути, я нашел по крайней мере три различные переменные пути, все из которых я обновил: путь к дополнительным настройкам Windows (установлен вручную), путь к консоли Windows (установлен через консоль с помощью setx) и sys.path (установлен или установлен во время выполнения), добавляя ";C:\ffmpeg\bin" , где ffmpeg эффективно. Независимо от того, что я разбираюсь в проблеме или нет, я хотел бы узнать, какая из этих переменных среды имеет значение для чего-то, я нахожу ее очень запутанной.

Код следующий:

 # -*- 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) 

anim.save(r'C:\basic_animation.mp4', writer = FFwriter, fps=30) для anim.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 

anim.save(r'C:\animation.gif', writer='imagemagick', fps=30) для anim.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) 

Некоторое время смотрел на них.

Спасибо за ваше время!

UPDATE: я выполнил шаги в этом сообщении для предоставления доступа как к C: \ ffmpeg, так и к папке назначения, но не повезло 🙁

2 Solutions collect form web for “Невозможно сохранить анимацию в matplotlib: разрешение Windows запрещено”

Попробуйте сохранить файлы в другом месте для целей отладки. То есть: где вы сохраняете «C: \ basic_animation.mp4», попробуйте что-то вроде « C: \ TEMP \ basic_animation.mp4».

Если я правильно помню, win7 + добавил дополнительную безопасность в «C: \» и другие каталоги. Этот простой тест скажет вам, является ли проблема целевым каталогом или нет.

Я рекомендую всегда использовать временную директорию системы для такого рода вещей, а затем перемещать файл, куда он должен идти. Вы можете получить temp tue текущей системы TEMP в Python следующим образом:

 import tempfile print tempfile.gettempdir() 

Кроме того, о кодеке «ascii» не удается декодировать «проблему: это проблема преобразования строк. Случается постоянно, особенно в Windows.

Проверьте это: http://nedbatchelder.com/text/unipain/unipain.html#1

Но на этот раз, похоже, внутри FFMPEG, так как «anim» – это какой-то экземпляр, возвращаемый «FuncAnimation», и я не вижу никаких нарушений от вас при его использовании. Лучшее, что вы можете сделать, это гарантировать, что все ВАШИ строки правильно преобразованы перед использованием. Например, как строки пути.

Вот еще один комментарий по этому поводу: https://stackoverflow.com/a/21129492

Для того, что я могу понять из вашей трассировки стека, ошибка преобразования строк происходит в некоторой многословной / лог-функции внутри навеса. Возможно, он пытается записать что-то с символами не-ascii. Таким образом, вы также можете попробовать некоторый флаг купола для отключения log / verbose; может быть, этого достаточно.

Возможно, это не сюрприз. Мой путь к ffmpeg, C:\ffmpeg\bin , был неправильным; так как это должен быть путь прямо к файлу exe, а не только к родительской папке, как я неправильно понял из статьи Stretch, и, как заметил Даниил. Обратите внимание, что я уже пробовал это раньше, но только изменил сообщение об ошибке в то время. Спокойный, отдохните и внимательно прочитайте, а не просто найдите код, который вам подойдет. Это просто ошибка. Это ответ.

  • Обратное изображение из CGI python с использованием javascript
  • Установка одинаковых границ оси для всех подзадач в matplotlib
  • график времени дня против даты в matplotlib
  • Как удалить / опустить небольшие контурные линии, используя matplotlib
  • Вложение сетевого графика в wxPython с помощью matplotlib
  • Matplotlib / pyplot: Как обеспечить использование диапазона оси?
  • не удается установить matplotlib с помощью pip
  • Как вы строите вертикальную линию на графике временного ряда в Пандах?
  • Python - лучший язык программирования в мире.