PermissionError: [Errno 13] Отказано в доступе при сохранении HoloMap в GIF - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь создать анимированный концерт из серии тепловых карт с помощью HoloViews. Мне нужно сделать это в скрипте Python, т.е. е. специально не в блокноте Jupyter.

При сохранении изображения Python выдает ошибку, поскольку он не может создать временный файл во временной папке текущего пользователя (это под Windows). Происходит независимо от пользователя, даже когда я запускаю Python от имени администратора.

Когда я останавливаюсь в отладчике и изменяю путь к временному файлу в другом месте, e. г. Рабочий стол, который работает, но в результате holo.gif в рабочем каталоге пуст (0 байт). Временный GIF, однако, правильно анимирован, поэтому я думаю, код в основном в порядке.

[ Редактировать: Уже не уверен. Я провел эту ночь на 26.531 карте тепла, каждая из которых состояла из сетки 5x5. Процесс не завершился (т.е. не достиг точки прерывания на линии Image.py 1966). Есть ли способ сделать то, что я хочу, менее болезненно медленным?]

Ответы на аналогичные проблемы в StackOverflow указывали на проблемы с разрешениями (но что это может быть за проблема, если она даже не работает для администратора?) И предлагали сохранить в другом месте, что здесь невозможно, так как у меня нет контроль, где matplotlib будет пытаться создавать временные файлы.

Проблема, в частности, с GIF, я могу создать * .png или * .html вывод без ошибок. (AFAIK, разница в том, что gif-создание использует ImageMagick.)

Вот код (исключение построения базовых данных тепловой карты):

import holoviews as hv
hv.extension('matplotlib')

renderer = hv.renderer('matplotlib')
renderer.fps = 3

heatMapDict = {
    k: hv.HeatMap(measurements[k].sensors) for k in range(len(measurements))
}
holo = hv.HoloMap(heatMapDict, kdims='index')
renderer.save(holo, 'holo', fmt='gif')

И трассировка:

    INFO:matplotlib.animation:Animation.save using <class 'matplotlib.animation.PillowWriter'>
Traceback (most recent call last):
  File "cm3.py", line 69, in <module>
    renderer.save(holo, 'holo', fmt='gif')
  File "C:\Users\y2046\AppData\Local\Programs\Python\Python37\lib\site-packages\holoviews\plotting\renderer.py", line 554, in save
    rendered = self_or_cls(plot, fmt)
  File "C:\Users\y2046\AppData\Local\Programs\Python\Python37\lib\site-packages\holoviews\plotting\mpl\renderer.py", line 108, in __call__
    data = self._figure_data(plot, fmt, **({'dpi':self.dpi} if self.dpi else {}))
  File "C:\Users\y2046\AppData\Local\Programs\Python\Python37\lib\site-packages\holoviews\plotting\mpl\renderer.py", line 196, in _figure_data
    data = self._anim_data(anim, fmt)
  File "C:\Users\y2046\AppData\Local\Programs\Python\Python37\lib\site-packages\holoviews\plotting\mpl\renderer.py", line 246, in _anim_data
    anim.save(f.name, writer=writer, **anim_kwargs)
  File "C:\Users\y2046\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\animation.py", line 1174, in save
    writer.grab_frame(**savefig_kwargs)
  File "C:\Users\y2046\AppData\Local\Programs\Python\Python37\lib\contextlib.py", line 119, in __exit__
    next(self.gen)
  File "C:\Users\y2046\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\animation.py", line 232, in saving
    self.finish()
  File "C:\Users\y2046\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\animation.py", line 583, in finish
    duration=int(1000 / self.fps))
  File "C:\Users\y2046\AppData\Local\Programs\Python\Python37\lib\site-packages\PIL\Image.py", line 1966, in save
    fp = builtins.open(filename, "w+b")
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\y2046\\AppData\\Local\\Temp\\tmp4im5ozo8.gif'

Добавление: Я начинаю думать, что это не проблема разрешения в конце концов. Возможно, это связано с повторным входом и блокировкой файлов в Windows? Фактически процесс Python может создавать файлы во временном каталоге, что подтверждается вставкой следующего тестового кода перед вызовом renderer.save():

import os
import builtins
filename = 'C:\\Users\\y2046\\AppData\\Local\\Temp\\test.txt'
fp = builtins.open(filename, "w+b")
try:
    fp.write("first".encode('utf-8'))
finally:
    fp.close()
os.remove(filename)

Я должен проверить это под Linux. Если это работает там, то, возможно, есть ошибка в авторе Подушки.

1 Ответ

0 голосов
/ 07 ноября 2018

Похоже, что-то не работает с HoloViews. Я открыл им выпуск # 3151 .

...