subprocess.getoutput 在 Python 3 returns 空字符串中使用 sed shell 命令

subprocess.getoutput with sed shell command in Python 3 returns null string

我在 sh 或 bash 中使用以下命令来获取电影文件的分辨率:

/opt/local/bin/ffmpeg -i TEST.mp4 2>&1 | sed -n "s/.*, \(.*\) \[.*//p"

...它 returns 输入文件分辨率的字符串,如“640x480”。太好了。

将其转换为 Python 3.4 脚本,我似乎无法让它工作:

import subprocess
stdoutstr = subprocess.getoutput('/opt/local/bin/ffmpeg -i /Users/alexis/TEST.mp4 2>&1 | /usr/bin/sed -n "s/.*, \(.*\) \[.*//p"')
print("stdoutstr:” + stdoutstr.split()[0])

上面的Python3代码returns一个空字符串。我怎样才能让它工作?

如果你使用了subprocess.check_output,如果命令失败,它会抛出一个异常。这会让您了解出了什么问题。

但真正的问题是您必须指定 shell=True 以允许 shell 解释您的重定向。否则,执行的命令将包含文字元字符,如 | 和 space,您可能不想要这些元字符。

没有 shell=True,就像在 shell 提示符下将 整个 命令用单引号括起来一样。这显然会因找不到命令错误而失败。

这应该适合你:

stdoutstr = subprocess.check_output(
    """/opt/local/bin/ffmpeg -i /Users/alexis/TEST.mp4 2>&1 | /usr/bin/sed -n 's/.*, \(.*\) \[.*/\1/p'""",
    shell=True, universal_newlines=True)

我会警告你,在我的机器上 ffmpeg 不在 /opt/local/bin 中并且 sed 不在 /usr/bin/sed 中。在我的机器上,ffmpeg/usr/bin 中,sed/bin/sed 中,因此我不得不稍微调整命令以将其放回原始示例中。或者,如果这些位置已经在您的 PATH 中,您可以完全删除它们:

stdoutstr = subprocess.check_output(
    """ffmpeg -i /Users/alexis/TEST.mp4 2>&1 | sed -n 's/.*, \(.*\) \[.*/\1/p'""",
    shell=True, universal_newlines=True)