如果我在同一台机器上执行以下操作,我会按预期获得漂亮的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(印刷版)”
为什么不接受这些论点?值得一提的是,如果我删除所有参数并只保留输入文件和“ - ”,它就像魅力一样。
答案 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所做的事情。