【发布时间】:2018-10-12 18:37:58
【问题描述】:
我有一个我想用 python 脚本执行的 shell 命令。它是ffmpeg、grep、gawk 和其他几个ffmpeg 选项的组合。
命令
ffmpeg -i http://0.0.0.0:8080/stream/video.mjpeg -vcodec copy -map 0 -f segment -segment_time 2 -loglevel 40 -segment_format mp4 capture-%05d.mp4 2>&1 | grep --line-buffered -Eo "segment:.+ended" | gawk -F "'" '{print $2; system("")}'
如果你在终端上运行这个命令,它应该返回一个字符串
capture-00001.mp4
现在,我的目标是在 Python3 上使用 subprocess 运行它。由于该命令比较复杂,带有单引号和双引号,需要正确处理,否则会报错EOL while scanning string literal、invalid syntax等。
我尝试了几种字符串格式化方法,但都没有奏效。以下是我尝试过的一种方法。
脚本
import os
import datetime
import subprocess
first = "segment:.+ended"
second = "'"
third = '{print $2; system("")}'
if __name__ == "__main__":
fScript = "ffmpeg -i http://0.0.0.0:8080/stream/video.mjpeg -vcodec copy -map 0 -f segment -segment_time 2 -loglevel 40 -segment_format mp4 capture-%05d.mp4 2>&1 | grep --line-buffered -Eo {} | gawk -F {} {}".format(first, second, third)
try:
result = subprocess.check_output(fScript, shell=True).decode('utf-8')
print(result)
except subprocess.CalledProcessError as e:
print(e.output)
【问题讨论】:
-
问题是你的命令不是一个单独的子进程,它是 3(
ffmpeg管道到grep管道到awk)。如果你想用 subprocess 模块复制它,你可以将所有 3 个作为单独的子进程运行并将管道连接在一起。 -
@TomDalton 感谢您的链接。会研究它
-
可能已经尝试过了,但你可以试试:
fscript = r"""ffmpeg -i http://0.0.0.0:8080/stream/video.mjpeg -vcodec copy -map 0 -f segment -segment_time 2 -loglevel 40 -segment_format mp4 capture-%05d.mp4 2>&1 | grep --line-buffered -Eo "segment:.+ended" | gawk -F "'" '{print $2; system("")}'""" -
@NathanBlaine 您的脚本有效,但它没有按预期打印结果,我猜它是子进程。无论如何,你能告诉我
r是做什么的吗?
标签: python string ffmpeg subprocess