PermissionError:[Errno 13]将HoloMap保存到GIF

时间:2018-11-05 22:51:59

标签: python matplotlib gif holoviews

我正在尝试使用HoloViews通过一系列热图创建动画演出。 我需要在Python脚本中执行此操作。 e。特别是不在Jupyter笔记本中。

保存图像时,Python引发错误,因为它无法在当前用户的临时文件夹(在Windows下)中创建临时文件。不管用户是谁,即使我以admin身份运行Python也会发生。

当我停在调试器中并将临时文件路径更改为其他位置时,例如。 G。桌面可以运行,但是工作目录中生成的 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进程可能会在temp目录中创建文件,这可以通过在调用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 :(得分:0)

HoloViews似乎有问题。我已经与他们一起打开issue #3151