无法在matplotlib中保存动画:Windows权限被拒绝

时间:2015-05-12 19:34:50

标签: python animation matplotlib ffmpeg

我一直在努力解决这个问题,检查类似的线程,但没有成功。 Stretch's Cannot save matplotlib animation with ffmpeg帮助解决了之前的错误(我的ffmpeg路径错误),但在修复之后我一直拒绝访问。

我的ffmpeg二进制文件位于C:\ffmpeg\bin

一个不错的选择是能够导出gif文件,但我一直在使用imagemagick获得ascii错误。我认为这两个问题都是相关的,所以我想首先解决ffmpeg。

我认为这个问题可能与我正在使用Canopy(在Windows 8 64bit中)的事实有关,这几乎是我的路径变量的霸权并且在路上打破了一些东西(例如我无法打开IDLE我安装了Canopy,还没有尝试解决这个问题)。随着我修复的方式,我找到了至少3个不同的路径变量,我更新了所有这些变量: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)的追溯:

%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)的追溯:

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) 

盯着他们看了一会儿。

谢谢你的时间!

更新:我按照this post中的步骤授予对C:\ ffmpeg和目标文件夹的访问权限,但没有运气:(

2 个答案:

答案 0 :(得分:1)

尝试将文件保存在其他位置,以进行调试。 那就是:你在哪里保存&#34; C:\ basic_animation.mp4&#34;,尝试类似&#34; C:\ TEMP \ basic_animation.mp4&#34;。

如果我没记错的话,win7 +在&#34; C:\&#34;中增加了额外的安全性。和其他目录。这个简单的测试将告诉您问题是否是目标目录。

我建议总是使用系统的临时目录来处理这类事情,然后将文件移到应该去的地方。您可以在Python中获取当前系统的TEMP dir:

import tempfile

print tempfile.gettempdir()

此外,关于&#34; &#39; ascii&#39;编解码器无法解码&#34;问题:这是一个字符串转换问题。一直发生,特别是在Windows上。

检查出来:http://nedbatchelder.com/text/unipain/unipain.html#1

但这次似乎是在FFMPEG的内部,因为&#34; anim&#34;是由&#34; FuncAnimation&#34;返回的一些实例,我没有看到你对它的使用有任何不当行为。您可以做的最好的事情是在使用之前保证所有字符串都已正确转换。例如路径字符串。

以下是对此的另一个评论:https://stackoverflow.com/a/21129492

对于我能理解的堆栈跟踪,字符串转换错误发生在canopy中的一些详细/日志函数中。也许正在尝试使用非ascii字符记录某些内容。所以,你也可以尝试一些冠层标志来进行日志/详细禁用;也许这就够了。

答案 1 :(得分:1)

也许并不奇怪。我的ffmpeg路径C:\ffmpeg\bin是错误的;因为它应该是直接到exe文件的路径,而不仅仅是父文件夹,因为我从Stretch的帖子中误解了,正如Daniel指出的那样。 注意我之前已经尝试过这个,但当时只是更改了错误信息。 冷静,休息一下,仔细阅读,而不只是寻找适合你的代码。这只是个错误。 这就是答案。