shell 命令上的 Python 复杂字符串插值

标签 python string ffmpeg subprocess

我有一个想要使用 python 脚本执行的 shell 命令。它是 ffmpeggrepgawk 和其他几个 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/

相关文章:

video - FFmpeg 分割大文件

c++ - 我用 Gstreamer MSVC 1.16.1 构建 opencv 3.4,现在 imread 和 VideoCapture 不起作用

python - DNS 解析器不包含答案

python - 运行 scipy.test ('full' 需要多长时间)?

java - Java 中的无效转义序列

java - 查找不同行星上的年龄

python - 用于识别组的正则表达式

python - 使用 Python 按列分组并求和另一列的内容

c - 结构和字符串

python - 如何在flask服务器中使用ffmpeg在音频格式之间进行转换而不将文件写入磁盘?