Я пытаюсь создать анимированный концерт из серии тепловых карт с помощью 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. Если это работает там, то, возможно, есть ошибка в авторе Подушки.