在python中将带双引号的命令传递给subprocess.call

在python中将带双引号的命令传递给subprocess.call,python,shell,ffmpeg,subprocess,Python,Shell,Ffmpeg,Subprocess,我想使用包含双引号的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

我想使用包含双引号的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

执行的一种方法是创建一个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
import subprocess; subprocess.call(`./script.sh`; shell=True)
然后可以将其保存为
script.sh
,然后可以按如下方式调用脚本:

#!/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
import subprocess; subprocess.call(`./script.sh`; shell=True)

当您调用
ffmpeg。。。drawtext=“fontfile…”
,ffmpeg看到的参数是
drawtext=fontfile
。也就是说,shell删除了双引号。不要包含它们。如果您意识到当您调用
ffmpeg drawtext=“fontfile”
时,shell调用的过程与调用
ffmpeg“drawtext=fontfile”
ffmpeg drawtext=fontfile
时调用的过程完全相同,可能会更清楚。它在@williampersell工作。谢谢花了一个多小时试图弄清楚为什么它在bash中工作,但在使用subprocess.call时却没有。从drawtext中删除双引号成功了!是的,但我不喜欢将python与bash脚本混合使用。实际上@williampersell给了我一个很好的提示,它可以工作drawtext=
“drawtext=fontfile=…x=20:y=20”
,所以我只是删除了fontfile周围的引号,当然还有行中的“`”,然后subprocess.call行就可以按预期工作了。