【问题标题】:Python complex string interpolation on shell commandshell命令上的Python复杂字符串插值
【发布时间】:2018-10-12 18:37:58
【问题描述】:

我有一个我想用 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 while scanning string literalinvalid 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


【解决方案1】:

感谢@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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    相关资源
    最近更新 更多