2015-05-12 70 views
2

我一直试图整理一下,检查类似的线程,但没有成功。 Stretch's Cannot save matplotlib animation with ffmpeg与以前的错误帮助(我有ffmpeg路径错误),但我不断修复后得到拒绝访问。无法保存在matplotlib中的动画:Windows权限被拒绝

我的ffmpeg二进制是C:\ffmpeg\bin

一个不错的选择将能够出口的gif文件,但我不断收到与ImageMagick的一个ascii错误。我认为这两个问题都是相关的,所以我想首先理清ffmpeg。

我认为这个问题可能与我正在使用Canopy(Windows 8 64位)的事实有关,它几乎霸占了我的路径变量并在路上破坏了一些东西(例如,我无法打开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) 

在他们盯着了一段时间。

谢谢你的时间!

更新:我跟着授予访问权限于C在this post步骤:\ ffmpeg的和目标文件夹,但没有运气:(

回答

1

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

1

尝试保存文件在其他地方,为了调试的目的 也就是说。 :你在哪里节约 “C:\ basic_animation.mp4”,你可以试试。 “C:\ TEMP \ basic_animation.mp4”

如果我记得是正确的,WIN7 +添加了额外的“C安全:\ “和其他目录,这个简单的测试会告诉你问题是否是目的地目录

我会推荐总是使用系统的临时目录来处理这类事情,然后将文件移动到应该去的地方。你可以得到星期二当前系统的临时目录在Python这样的:

import tempfile 

print tempfile.gettempdir() 

此外,关于“‘ASCII’编解码器不能解码”的问题:这是一个字符串转换问题。所有时间都会发生,特别是在Windows上。

检查了这一点:http://nedbatchelder.com/text/unipain/unipain.html#1

但是这一次似乎是FFmpeg的内部,为“动画”是“FuncAnimation”返回某些情况下,我看不出有任何不当行为,从你的使用。你可以做的最好的事情就是保证所有的字符串在使用前都被正确转换。例如,像路径字符串一样。

下面是关于另一个注释:https://stackoverflow.com/a/21129492

什么,我能理解你的堆栈跟踪中,字符串转换误差在树冠内的一些详细/日志功能发生。也许是试图用非ascii字符记录一些东西。所以,你也可以尝试一些冠层标志进行日志/冗长禁用;也许这就够了。

+0

是的,我试过改变目标文件夹,但没有运气;没有更改保存到tempfile.gettempdir(),也没有。 – Vladimir

+0

我很清楚编码问题,但这次通常的预防措施是不够的。 谢谢! – Vladimir

+0

问题:这是(在这个例子中的)你的FFMPEG的可执行文件的路径?我的意思是,[拉伸的解决方案](http://stackoverflow.com/a/23098090/1947398)表示,你需要“提供的路径一路ffmpeg二进制”,我所知道的是“二进制编译的可执行文件“,但在你的例子中,它似乎是”bin“目录的路径;这也意味着“ffmpef二进制”。 –