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)
我在 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)