subprocess.check_output不接受长参数

时间:2012-09-05 19:57:01

标签: python subprocess wkhtmltopdf

如果我在同一台机器上执行以下操作,我会按预期获得漂亮的PDF:

$ wkhtmltopdf --title "Transaction 773 (printed version)" --margin-left 5 --margin-right 2 --encoding utf8 www.google.com - > salida.pdf

但如果来自一个普通的python shell ,我会这样做:

>>> import subprocess
>>> f = open("salida.pdf", "wb")
>>> f.write(subprocess.check_output(["wkhtmltopdf", '--title "Transaction 773 (printed version)"', "--margin-left 5", "--margin-right 2", "--encoding utf8", "www.google.com", "-"]))

然后我得到的只是常见错误:

/usr/lib/python2.7/subprocess.pyc in check_output(*popenargs, **kwargs)
    542         if cmd is None:
    543             cmd = popenargs[0]
--> 544         raise CalledProcessError(retcode, cmd, output=output)
    545     return output
    546 

CalledProcessError: Command '['wkhtmltopdf', '--title "Transaction 773 (printed version)"', '--margin-left 5', '--margin-right 2', '--encoding utf8', 'www.google.com', '-']' returned non-zero exit status 1

查看完整的错误消息,它告诉我:

  

未知的长论证 - 标题“交易773(印刷版)”

为什么不接受这些论点?值得一提的是,如果我删除所有参数并只保留输入文件和“ - ”,它就像魅力一样。

2 个答案:

答案 0 :(得分:5)

您需要在单独的项目中指定每个参数,而长参数实际上是 2 值:

f.write(subprocess.check_output([
    "wkhtmltopdf", 
    '--title', "Transaction 773 (printed version)",
    "--margin-left", "5",
    "--margin-right", "2",
    "--encoding", "utf8",
    "www.google.com", "-"]))

通常,shell解析这样的命令行,在空格上拆分它(除非文本用引号括起来),然后将其作为argv值传递给新进程。

现在,您正在自己创建argv列表,并且您必须自己进行拆分。请注意,--title参数因此不再需要具有shell级别引号。

短参数(-ml5或类似的)没有那个空格,所以你没有问题。

答案 1 :(得分:2)

--title "Transaction 773 (printed version)"两个参数,而不是一个,必须以这种方式传递,即作为两个单独的列表项。错误是说没有--title "Transaction 773 (printed version)"这样的命令行选项 - 它期待--title后跟标题作为单独的参数。(另外,你不会需要标题周围的引号。)

原因是shell通常会处理拆分命令行参数。实际的可执行文件获取shell解析的参数列表,并且不期望必须进一步拆分它们。你在没有shell的情况下调用可执行文件,所以你必须做shell所做的事情。