1

だから、私はターミナルffmpegコマンドからの文字列応答をオブジェクトプロパティに保存しようとしている単純なクラスを持っています:

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

この例外が発生します:

richard@richard-desktop:~/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

subprocess.call()の前にself.absolute_pathを出力すると、次のようになるため、パスは正しいです。

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

そして、このファイルは存在します。

4

3 に答える 3

6

問題は

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)

コマンドと引数を別々に与えるために。このように、引用符などの問題はなく、不要なシェル呼び出しを省略します。

于 2012-06-27T12:20:54.550 に答える
1

ところで、コマンドの出力を変数に格納する場合は、のcheck_output代わりにを使用する必要がありますcall

http://docs.python.org/library/subprocess.html#subprocess.check_output

于 2012-06-27T12:31:26.677 に答える
1

エラー出力であるため、実際にffmpegから出力を取得するこの方法を使用しました。

    ffmpeg_command = ["avconv", "-i", self.absolute_path]
    p = Popen(ffmpeg_command, stdout=PIPE, stderr=PIPE)
    stdout, stderr = p.communicate()
于 2012-06-27T14:23:29.760 に答える