2

我正在尝试使用 subprocess.call 从 Python 2.7 调用 ImageMagick 命令。我的问题是子进程中的参数解析器在每个参数周围都放了一个双引号,而 ImageMagick 似乎对非文件参数周围的引号有问题。

我想要的是这样的

"imagemagick.exe" "im1.png" "im2.png" -alpha off ( ... ) -composite "im3.png"

到目前为止,除了手动构造带有丑陋+ " " +元素的字符串并使用shell=True.

这是我的代码:

args = [    imagemagick,
            filename + "_b.bmp",
            filename + "_w.bmp",
            "-alpha off ( -clone 0,1 -compose difference -composite -negate ) ( -clone 0,2 +swap -compose divide -composite ) -delete 0,1 +swap -compose Copy_Opacity -composite",
            filename + ".png" ]   

subprocess.call( args )

有没有办法使用子进程调用不带双引号的正确命令?

更新:插入了完整的命令行。我想把那部分放在一起,而不是“alpha”,“-off”,......一个接一个。

4

2 回答 2

3

使用 调用外部程序时subprocess每个参数必须是 的不同元素args。所以试试:

args = [    imagemagick,
            filename + "_b.bmp",
            filename + "_w.bmp",
            "-alpha", "off", "( ... )", "-composite",
            filename + ".png" ]

我不确定它( ... )代表什么,但如果你在命令行中放了不带引号的空格,它们也应该是单独的元素args

于 2012-06-21T01:51:41.387 回答
1

感谢格雷格的回答,我想出了这个解决方案。我的观点是使代码在 Python 中易于阅读。我的意思是复杂的部分应该保存为一个字符串,因为保持它完整很重要(如果需要,复制粘贴到命令行/批处理文件等)

imarg = "-alpha off ( -clone 0,1 -compose difference -composite -negate ) ( -clone 0,2 +swap -compose divide -composite ) -delete 0,1 +swap -compose Copy_Opacity -composite"
args = [ imagemagick, filename + "_b.bmp", filename + "_w.bmp" ] + imarg.split() + [ filename + ".png" ]
subprocess.call( args )

它似乎工作正常!你看到这个有什么问题吗?

于 2012-06-21T02:05:43.580 回答