我有一个想要使用 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
、无效语法
等。
我尝试了几种字符串格式化方法,但都不起作用。以下是我尝试过的方法之一。
脚本
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)
最佳答案
感谢 @NathanBlaine 的建议,使用 r
标记字符串文字非常适合我的用例。每天总是很高兴学习新事物。 :)
但是,我无法使用 check_output
检索字符串结果。相反,subprocess.call
设法返回了预期的字符串。这是工作代码。
import os
import datetime
import subprocess
if __name__ == "__main__":
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("")}'"""
try:
result = subprocess.call(fScript, stderr=subprocess.STDOUT, shell=True).decode('utf-8')
print(result)
except subprocess.CalledProcessError as e:
print(e.output)
关于shell 命令上的 Python 复杂字符串插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50138249/