4

如果我在同一台机器上执行以下操作,我会得到预期的漂亮 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

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

未知的长参数 --title “交易 773(印刷版)”

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

4

2 回答 2

6

您需要在单独的项目中指定每个参数,长参数实际上是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或类似的)没有那个空格,所以你对这些没有问题。

于 2012-09-05T19:58:59.887 回答
2

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

这样做的原因是外壳程序通常处理拆分命令行参数。实际的可执行文件会得到一个 shell 解析的参数列表,并且不需要进一步拆分它们。您在没有外壳的情况下调用可执行文件,因此您必须执行外壳所做的事情。

于 2012-09-05T20:00:39.687 回答