4

同じマシンから次の操作を行うと、期待どおりの美しい PDF が得られます。

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

しかし、一般的な python シェルからの場合:

>>> 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 "Transaction 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", "-"]))

通常、シェルはそのようなコマンド ラインを解析し、空白で分割し (テキストが引用符で囲まれている場合を除く)、それをargv値として新しいプロセスに渡します。

今、あなたはそのargvリストを自分で作成しており、分割を自分で行う必要があります。--titleしたがって、引数にシェルレベルの引用符を付ける必要がなくなったことに注意してください。

短い引数 (-ml5または同様のもの) にはその空白がないため、問題はありませんでした。

于 2012-09-05T19:58:59.887 に答える
2

--title "Transaction 773 (printed version)"は1つではなく、 2つの引数であり、そのように、つまり2つの別個のリスト項目として渡す必要があります。エラーは、次のようなコマンドラインオプションがないことを示しています-別の引数としてタイトルが続く--title "Transaction 773 (printed version)"ことを期待しています。(また、タイトルを引用符で囲む必要はありません。)--title

これは、シェルが通常、コマンドライン引数の分割を処理するためです。実際の実行可能ファイルは、シェルが解析した引数のリストを取得し、それらをさらに分割する必要はありません。シェルなしで実行可能ファイルを呼び出しているので、シェルが実行したことを実行する必要があります。

于 2012-09-05T20:00:39.687 に答える