Python 如何在子流程中不引用参数?

Python 如何在子流程中不引用参数?,python,command-line,command,imagemagick,subprocess,Python,Command Line,Command,Imagemagick,Subprocess,我试图使用subprocess.call从Python 2.7调用ImageMagick命令。我的问题是,子流程中的参数解析器在每个参数周围都加了一个双引号,而ImageMagick似乎在非文件参数周围加引号有问题 我想要的是这样的东西 "imagemagick.exe" "im1.png" "im2.png" -alpha off ( ... ) -composite "im3.png" 到目前为止,除了用丑陋的+“”+元素手动构造字符串并用shell=True调用它之外,我找不到一种使用子

我试图使用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 )
是否有任何方法可以在不使用双引号的情况下使用subprocess调用正确的命令


更新:插入完整的命令行。我想把这部分放在一起,而不是像“阿尔法”,“关”。。。一个接一个。

使用
子进程调用外部程序时,每个参数必须是
参数的不同元素。因此,请尝试:

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

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

使用
子进程调用外部程序时,每个参数都必须是
args
的不同元素。因此,请尝试:

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

我不确定
(…)
代表什么,但如果在命令行中放置不带引号的空格,它们也应该是
参数中的独立元素。

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


它似乎工作得很好!你认为这有什么问题吗?

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



它似乎工作得很好!你看到这个有什么问题吗?

我们可以不用黑体字很好地浏览文本。当有巨大的黑色斑点时会有点分散注意力,所以请谨慎使用粗体文本。我们可以在不使用粗体的情况下很好地浏览文本。当出现巨大的黑色斑点时会有点分散注意力,因此请谨慎使用粗体文本。这是原始命令,我不想发布它,因为它不是问题的最重要部分:
“-alpha off(-clone 0,1-合成差异-合成-否定)(-clone 0,2+交换-合成分割-合成)-删除0,1+swap-compose Copy\u Opacity-composite“
您认为我应该在单独的arg中分隔它们吗?如果在shell命令行中使用引号,则将整个内容放在
args
的一个元素中(不带引号)。如果在shell命令行中不使用引号,则在未加引号的空格中拆分,并在
args
中每个单词使用一个元素。请记住,在事物周围加引号仅在shell命令行中有意义。当一个程序要求内核执行另一个进程时,引号没有任何意义,传递的是一个没有进一步处理的字符串数组。我只是在寻找一种调用命令的好方法,我所说的nice是指易于阅读的Python源代码。我在想这样的事情:'imarg3=“-alpha off(-clone 0,1-compose difference-composite-negate)(-clone 0,2+swap-compose divide-composite)-delete 0,1+swap-compose Copy_Opacity-composite.split()args=[imagemagick,filename+“_b.bmp”,filename+“_w.bmp”,imarg3,filename+.png”]子进程调用(args)我想出了一种方法,既避免了外壳,又美观大方(贴在下面)。你有什么不推荐的吗?这是最初的命令,我不想发布它,因为它不是问题的最重要部分:
“-alpha off(-clone 0,1-合成差异-合成-否定)(-clone 0,2+交换-合成分割-合成)-删除0,1+交换-合成副本\u不透明-合成”
您认为我应该在单独的arg中分隔它们吗?如果您在shell命令行中使用引号,则将整个内容放在
args
的一个元素中(不带引号)。如果在shell命令行中不使用引号,则在未加引号的空格中拆分,并在
args
中每个单词使用一个元素。请记住,在事物周围加引号仅在shell命令行中有意义。当一个程序要求内核执行另一个进程时,引号没有任何意义,传递的是一个没有进一步处理的字符串数组。我只是在寻找一种调用命令的好方法,我所说的nice是指易于阅读的Python源代码。我在想这样的事情:'imarg3=“-alpha off(-clone 0,1-compose difference-composite-negate)(-clone 0,2+swap-compose divide-composite)-delete 0,1+swap-compose Copy_Opacity-composite.split()args=[imagemagick,filename+“_b.bmp”,filename+“_w.bmp”,imarg3,filename+.png”]子进程调用(args)我想出了一种方法,既避免了外壳,又美观大方(贴在下面)。你有什么不推荐的吗?你可能会想使用
+[imarg]+
,因为
imarg
是一个字符串,而不是一个列表。如果我这样做了,同样的事情也会发生。没有[]它工作得很好!奇怪!对不起,关键是末尾的split(),可能您错过了。这就是为什么我不应该把它放在[]中的原因。是的,一个更优雅的解决方案是将它放在第二行,我将纠正它。你可能会想使用
+[imarg]+
,因为
imarg
是一个字符串,而不是列表。如果我这样做,同样的事情会发生在开始。没有[]它工作得很好!奇怪!对不起,关键是末尾的split(),可能您错过了。这就是为什么我不该这么做