无法将参数传递给 subprocess.call

Having trouble passing arguments to subprocess.call

我在使用此 python 子例程时遇到问题...

def make_1024 ( src, tgt ):
    print "/usr/bin/convert %s -background none -gravity center -extent '1024x500!' %s" % ( src, tgt )
    rc = call ( ["/usr/bin/convert", src, "-background",  "none",  "-gravity", "center", "-extent", "'1024x500!'", tgt] )
    print "rc is %d" % rc

...我得到的输出是...

rc is 1

... 并且没有创建 1024x500 文件。我不知道为什么。我怀疑 "'1024x500!'" 参数一定有问题。

运行 你的代码,imagemagick 给出了回溯:

convert: invalid argument for option `-extent': '1024x500!' @ error/convert.c/ConvertImageCommand/1429.

这是您在范围值周围加上的引号

from subprocess import call

def make_1024 ( src, tgt ):
    print "/usr/bin/convert %s -background none -gravity center -extent 1024x500! %s" % ( src, tgt )
    rc = call ( ["/usr/bin/convert", src, "-background",  "none",  "-gravity", "center", "-extent", "1024x500!", tgt] )
    print "rc is %d" % rc

if __name__ == "__main__":
  make_1024(src="usage.jpg", tgt="test.jpg")

更具体地说,-extent "'1024x500!'""1024x500!"。如果这不起作用,您将必须提供有关回溯的更多详细信息。

!是shell中的元字符;您可能需要转义它,例如,如果您 运行 通过 shell 包含它的命令,则使用单引号。

subprocess.call默认不调用shell因此你不需要转义!,而且你应该删除不必要的单引号(没有shell 将它们从参数中删除)。

您可以使用 shlex.split() 查看如何将 shell 命令(字符串)转换为可以传递给 subprocess.call 的命令参数列表:

>>> import shlex
>>> shlex.split("echo 'abc!'")
['echo', 'abc!'] #NOTE: no embed quotes