2012-06-27 2 views
1

Итак, у меня есть простой класс, где я пытаюсь сохранить строку ответ от команды терминала FFmpeg в свойство объекта:Не удается запустить FFmpeg в subproces.call

import os 
import subprocess 

class Movie(object): 

    absolute_path = None 
    movie_info = None 

    def __init__(self, path): 
     self.absolute_path = "%s/%s" % (os.getcwd(), path) 
     if(os.path.exists(self.absolute_path) is False): 
      raise IOError("File does not exist") 

    def get_movie_info(self): 
     ffmpeg_command = "ffmpeg -i %s" % self.absolute_path 
     self.movie_info = subprocess.call(ffmpeg_command) 
     print self.movie_info 

Когда я затем запустить эту команду в CMD:

import os 
import sys 
sys.path.append(os.getcwd()) 

from Encode.Movie import Movie 

try: 
    movie = Movie("tests/test_1.mpg") 
    movie.get_movie_info() 
except IOError as e: 
    print e 

Я получаю это исключение:

[email protected]:~/projects/hello-python$ python main.py 
Traceback (most recent call last): 
    File "main.py", line 9, in <module> 
    movie.get_movie_info() 
    File "/home/richard/projects/hello-python/Encode/Movie.py", line 16, in get_movie_info 
    self.movie_info = subprocess.call(ffmpeg_command) 
    File "/usr/lib/python2.7/subprocess.py", line 493, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/usr/lib/python2.7/subprocess.py", line 679, in __init__ 
    errread, errwrite) 
    File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 

путь является правильным, потому что, когда я делаю печати self.absol ute_path до subprocess.call(), я получаю:

/home/richard/projects/hello-python/tests/test_1.mpg 

И этот файл существует.

ответ

1

Я на самом деле использовали этот способ получить выход из FFmpeg как это ошибка:

ffmpeg_command = ["avconv", "-i", self.absolute_path] 
    p = Popen(ffmpeg_command, stdout=PIPE, stderr=PIPE) 
    stdout, stderr = p.communicate() 
4

Проблема заключается в том

ffmpeg_command = "ffmpeg -i %s" % self.absolute_path 
self.movie_info = subprocess.call(ffmpeg_command) 
  • вы даете одну строку, как в командной строке, но опустить параметр shell=True.

Рекомендуемый способ, однако, чтобы сделать

ffmpeg_command = ["ffmpeg", "-i", self.absolute_path] 
self.movie_info = subprocess.call(ffmpeg_command) 

для того, чтобы дать команду и аргументы отдельно. Таким образом, у вас нет проблем с цитированием и т. Д., И вы опускаете ненужный вызов оболочки.

Смежные вопросы