【问题标题】:Print subprocess.Popen() output in Python在 Python 中打印 subprocess.Popen() 输出
【发布时间】:2020-02-29 22:28:44
【问题描述】:

我正在遍历一个目录并对每个文件运行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)

目前,我正在迭代的目录中有两个文件。

有什么办法可以打印出实际的持续时间吗?

谢谢。

【问题讨论】:

  • 您是否在终端内测试过传递给Popen 的命令的输出?
  • 是的,它有效。下面是结果,fprobe -i /Users/mbpuser1/Desktop/Remote2/av4_file1.ts -show_entries format=duration -sexagesimal -v quiet -of csv="p=0" 0:09:11.112389
  • 您是否验证了filename 变量?它是否包含它应该包含的字符串?如果它们包含相对路径,请尝试使用绝对路径。如果filename 没有问题,请尝试使用os.systemos.popen 而不是subprocess.Popen。您可以直接将字符串传递给这些方法,无需拆分。如果它仍然不起作用,我很抱歉,但我没有想法:/
  • 我必须承认我对编程很陌生,但我想没有输出被打印出来。我认为b' ' 输出是因为我使用python3.7 解释代码。如果我使用 python2.7 解释代码,那么我会得到空行作为输出。
  • 你是对的,python 3 和 2 之间存在差异。你可以阅读更多 here 但它可能对你没有帮助。尝试在for 循环内打印y 的值(你可以这样做:print(y))并检查其值是否正确。如果它们是正确的,请将p1 = subprocess.Popen(... 行替换为:p1 = os.popen("ffprobe -i " + y + " -show_entries ...).read()(显然不要将文字... 替换为cmd 的其余部分)并且不要忘记事先import os。这不起作用,我没有想法

标签: python ffprobe


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    如果你的内部命令是正确的,那么获取子进程输出的方式是这样的:

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

    【讨论】:

      猜你喜欢
      • 2019-12-18
      • 2010-10-17
      • 2012-02-28
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多