【问题标题】:Passing commands with double quotes to subprocess.call in python在python中将带有双引号的命令传递给subprocess.call
【发布时间】:2018-11-17 14:43:10
【问题描述】:

我想使用包含双引号的 python 将命令传递给运行 ffmpeg 的 Linux 机器。这是我的脚本:

drawtext = "drawtext=\"fontfile=DejaVuSans: text='Random Name': fontcolor=white: fontsize=24: box=1: boxcolor=black@0.5: boxborderw=5: x=20: y=20\""
subprocess.call(["ffmpeg", "-v", "error", "-i", input.mp4, "-vf", drawtext, output.mp4])

如果我打印 drawtext 变量,这是输出:

drawtext="fontfile=DejaVuSans: text='Reference Image': fontcolor=white: fontsize=24: box=1: boxcolor=black@0.5: boxborderw=5: x=20: y=20"

这是我在 ffmpeg 中的错误:

[Parsed_drawtext_0 @ 0x564ad79f99c0] [Eval @ 0x7ffd41131810] Invalid chars '"' at the end of expression '20"'
[Parsed_drawtext_0 @ 0x564ad79f99c0] Failed to configure input pad on Parsed_drawtext_0
Error reinitializing filters!
Failed to inject frame into filter network: Invalid argument
Error while processing the decoded data for stream #0:0

如果我在 Linux shell 中执行以下命令,它就可以正常工作:

$ ffmpeg -ss 10 -i input.mp4 -vf drawtext="fontfile=DejaVuSans: text='Random Name': fontcolor=white: fontsize=24: box=1: boxcolor=black@0.5: boxborderw=5: x=20: y=20" output.mp4

【问题讨论】:

  • 调用ffmpeg ... drawtext="fontfile..."时,ffmpeg看到的参数是drawtext=fontfile。也就是说,shell 删除了双引号。不要包括它们。
  • 如果您意识到当您调用ffmpeg drawtext="fontfile" 时,shell 调用的进程与您调用ffmpeg "drawtext=fontfile"ffmpeg dra"wtex"t=fon"tfile"ffmpeg drawtext=fontfile 时的进程完全相同。
  • 它有效@WilliamPursell。谢谢!
  • 花了一个多小时试图弄清楚为什么它在 bash 中工作,但在使用 subprocess.call 从 drawtext 中删除双引号时却没有成功!

标签: python shell ffmpeg subprocess


【解决方案1】:

一种执行方式是创建一个shell脚本,内容如下:

#!/bin/bash
ffmpeg -ss 10 -i input.mp4 -vf drawtext="fontfile=DejaVuSans: text='Random Name': fontcolor=white: fontsize=24: box=1: boxcolor=black@0.5: boxborderw=5: x=20: y=20" output.mp4

然后您可以将其保存为script.sh,然后您可以按如下方式调用脚本:

import subprocess; subprocess.call(`./script.sh`; shell=True)

【讨论】:

  • 是的,但我不喜欢将 python 与 bash 脚本混合使用。实际上@WilliamPursell 给了我一个很好的提示,它适用于drawtext = "drawtext=fontfile=... x=20: y=20",所以我只是删除了字体文件周围的引号,当然还有行中的``,然后subprocess.call 行按预期工作。
猜你喜欢
  • 2013-02-02
  • 2013-04-19
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 2023-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多