0

理解できない理由で、Popen.communicate の出力を端末に出力する以外は何もできません。

出力を変数に保存すると、端末にも出力できるため、変数にはテキストが含まれますが、len は 0 を返し、re.search は何も一致せず、find は常に -1 を返します。

問題のある機能:

#!/usr/bin/env パイソン
# コーディング: utf-8

OS のインポート
システムをインポート
getopt をインポート
サブプロセスのインポート
os.path をインポート
再輸入

def get_video_duration (ifile):
    p = subprocess.Popen(["ffprobe", ifile], stdout=subprocess.PIPE)
    info_str = p.communicate()[0].decode(sys.stdout.encoding)
    print(info_str) # デバッグの場合、ファイルに関する情報が正常に出力されます
    duration_start = info_str.find("期間")
    # duration_start = "AJDKLAJSL Duration:".find("Duration"), このテストは問題ありませんでした
    duration_end = info_str.find("開始", duration_start)
    number_start = info_str.find(" ", duration_start, duration_end) + 1
    number_end = info_str.find(",", number_start, duration_end)

    temp = info_str[開始番号:終了番号].split(":")

    return int(temp[0]) * 60 * 60 + int(temp[1]) * 60 + int(temp[2])

さまざまなバリエーションを試しました。.decode() を使用しないように、find を単一の re.search に変更し、各文字を反復して独自の find を実装します (問題は、これには len が必要であり、その特定の string/byte_array に対して len は常に 0 を返すことです)。

これは何らかのバグであるか、文字列のエンコーディングに関して何か間違ったことをしています。正確に何が問題なのかわかりません。どんな助けでも感謝します。

Ubuntu 12.10 64 ビット Python 2.7

4

1 に答える 1

1

エンコーディングに問題はありません。あなたの問題は、ffprobeがその出力(探している期間情報を含む)を標準出力ではなく標準エラー出力に送信することです。これを行うと、うまくいくはずです:

def get_video_duration (ifile):
    p = subprocess.Popen(["ffprobe", ifile], stderr=subprocess.PIPE)
    info_str = p.communicate()[1].decode(sys.stderr.encoding)

print() 呼び出しが機能しているように見える理由は、何も出力していないためです (info_str が本当に空であるため)...しかし、stderr 出力がコンソールにダンプされているため、見ているものがprint() 呼び出しの結果。

于 2013-04-24T08:08:19.173 に答える