我正在尝试使用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下进行测试。如果可以,那么枕头编写器中肯定有一个错误。