ValueError: операция ввода-вывода для закрытого файла при создании анимации - PullRequest
0 голосов
/ 29 июня 2018

Я использую matplotlib и ffmpeg для анимации. Я обычно пишу код на удаленном сервере, потому что код работает быстрее; у нас возникли проблемы с анимацией на удаленном сервере. Вот пример кода, который отлично работает на моем локальном Mac, но не работает удаленно.

import matplotlib as mpl
mpl.use('agg')
import matplotlib as mpl 
from matplotlib import animation
import pylab

def init():
    pylab.plot(pylab.arange(10), [0]*10)

def redraw(frame):
    pylab.plot(pylab.arange(10), pylab.arange(10) * frame)

fig = pylab.figure()
ani = animation.FuncAnimation(fig, redraw, frames=10, interval=1000, init_func=init)
ani.save('animation.mp4')

Я получаю нужную анимацию на своем локальном компьютере (macOS Sierra). Когда я запускаю его на удаленном хосте (Debian GNU / Linux 8 (jessie)), я получаю следующее сообщение об ошибке после 5 кадров

Traceback (most recent call last):
  File "animation.py", line 14, in <module>
    ani.save('animation.mp4')
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 1200, in save
    writer.grab_frame(**savefig_kwargs)
  File "/usr/lib/python2.7/contextlib.py", line 35, in __exit__
    self.gen.throw(type, value, traceback)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 241, in saving
    self.finish()
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 367, in finish
    self.cleanup()
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/animation.py", line 405, in cleanup
    out, err = self._proc.communicate()
  File "/usr/local/lib/python2.7/dist-packages/subprocess32.py", line 724, in communicate
    stdout, stderr = self._communicate(input, endtime, timeout)
  File "/usr/local/lib/python2.7/dist-packages/subprocess32.py", line 1535, in _communicate
    orig_timeout)
  File "/usr/local/lib/python2.7/dist-packages/subprocess32.py", line 1591, in _communicate_with_poll
    register_and_append(self.stdout, select_POLLIN_POLLPRI)
  File "/usr/local/lib/python2.7/dist-packages/subprocess32.py", line 1570, in register_and_append
    poller.register(file_obj.fileno(), eventmask)
ValueError: I/O operation on closed file

Моя локальная машина использует matplotlib версии 2.0.0; удаленный компьютер использует matplotlib версии 2.2.2

На моей локальной машине у меня ffmpeg версия 3.2.4

$ ffmpeg -version
ffmpeg version 3.2.4 Copyright (c) 2000-2017 the FFmpeg developers
built with Apple LLVM version 8.0.0 (clang-800.0.42.1)
configuration: --prefix=/usr/local/Cellar/ffmpeg/3.2.4 --enable-shared - 
-enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables 
--enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda
libavutil      55. 34.101 / 55. 34.101
libavcodec     57. 64.101 / 57. 64.101
libavformat    57. 56.101 / 57. 56.101
libavdevice    57.  1.100 / 57.  1.100
libavfilter     6. 65.100 /  6. 65.100
libavresample   3.  1.  0 /  3.  1.  0
libswscale      4.  2.100 /  4.  2.100
libswresample   2.  3.100 /  2.  3.100
libpostproc    54.  1.100 / 54.  1.100 

На удаленном хосте у меня ffmpeg версия 4.0.1

ffmpeg -version
ffmpeg version 4.0.1 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 4.9.2 (Debian 4.9.2-10+deb8u1)
configuration: --prefix=/usr/local
libavutil      56. 14.100 / 56. 14.100
libavcodec     58. 18.100 / 58. 18.100
libavformat    58. 12.100 / 58. 12.100
libavdevice    58.  3.100 / 58.  3.100
libavfilter     7. 16.100 /  7. 16.100
libswscale      5.  1.100 /  5.  1.100
libswresample   3.  1.100 /  3.  1.100

Если я правильно помню, я установил ffmpeg локально через homebrew; У меня есть анаконда дистрибутив питона. На удаленной машине у нас есть версия Python по умолчанию, которая поставляется с Jessie; Я не уверен, как сисадмин установил ffmpeg.

Я ни в коем случае не эксперт по ffmpeg, но у меня, как правило, никогда не возникало проблем с созданием анимации в matplotlib на моей локальной машине, и я действительно хотел бы иметь возможность быстрее снимать видео на удаленной машине. Любая помощь будет оценена!

Редактировать На удаленной машине анимация работает, если я использую avconv в качестве автора вместо ffmpeg. Я установил avconv локально ..., что привело меня к локальным проблемам с ffmpeg (возможно, из-за обновления общих зависимостей). Однако я удалил ffmpeg и переустановил его с кодеком x264, чтобы включить Анимации в записной книжке ipython (jupyter) - ValueError: операция ввода-вывода для закрытого файла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...