Вывести вывод subprocess.Popen () в Python - PullRequest
1 голос
/ 04 ноября 2019

Я перебираю каталог и запускаю ffprobe для каждого файла, чтобы узнать его длительность. Тем не менее, единственный вывод, который я получаю, это

b''
b''

Ниже приведена часть кода, который я использую,

for y in filename:
    p1 = subprocess.Popen (['ffprobe', '-i', y, '-show_entries', 'format=duration', '-sexagesimal', '-v', 'quiet', '-of', 'csv=%s' % ("p=0")], stdout=subprocess.PIPE).communicate()[0]
    print (p1)

В настоящее время каталог, через который я перебираю, содержит два файла.

Любые идеи, как распечатать фактическую продолжительность, пожалуйста?

Спасибо.

Ответы [ 2 ]

1 голос
/ 04 ноября 2019
import subprocess
import glob

for y in glob.glob("*.mkv"):
    p1 = subprocess.check_output(
        [
            "ffprobe",
            "-i",
            y,
            "-show_entries",
            "format=duration",
            "-sexagesimal",
            "-v",
            "quiet",
            "-of",
            "csv=%s" % ("p=0"),
        ],
        encoding="utf-8",
    ).strip()
    print(y, p1)

отлично работает для меня. (То есть, используя check_output() и добавляя параметр encoding.)

Результат равен

2018-02-19T00:01.mkv 0:17:47.120000

, как и ожидалось.

Моя версия Ffmpeg длячто это стоит,

ffmpeg version 4.2.1 Copyright (c) 2000-2019 the FFmpeg developers
built with Apple clang version 11.0.0 (clang-1100.0.33.8)
libavutil      56. 31.100 / 56. 31.100
libavcodec     58. 54.100 / 58. 54.100
libavformat    58. 29.100 / 58. 29.100
libavdevice    58.  8.100 / 58.  8.100
libavfilter     7. 57.100 /  7. 57.100
libavresample   4.  0.  0 /  4.  0.  0
libswscale      5.  5.100 /  5.  5.100
libswresample   3.  5.100 /  3.  5.100
libpostproc    55.  5.100 / 55.  5.100
0 голосов
/ 04 ноября 2019

Если ваша внутренняя команда верна, способ получить вывод подпроцесса выглядит так:

p1 = subprocess.run(['ffprobe', '-i', y, '-show_entries', 'format=duration', '-sexagesimal', '-v', 'quiet', '-of', 'csv=%s' % ("p=0")], shell=True, capture_output=True).stdout

...