1

ここではちょっとしたニッチなシナリオであり、直接テストするには、wkhtmltopdf (この場合は --read-args-from-stdin を使用してポート 7000 をリッスンする) を起動してデーモンとして実行する必要があります (および便利な html ファイルを手元に用意してください)。 .)

私が行った場合:

echo "-s letter -T 24mm -R 24mm -B 0mm -g ~/my.html /tmp/my.pdf" | nc localhost 7000

その後、非常に迅速に /tmp/my.pdf が表示されます ... これを 25 回続けて実行すると、wkhtmltopdf を 25 回上下に回転させた場合と同じ数の結果を得ることができます。

Walp、つまり、独自のキューを食べるデーモン内から THIS を呼び出せるようにする必要があり、さらに、結果の存在を確認し、それに応じて成功または失敗をチェックする前に、それが終了するのを待つ必要があります。

subprocess.call を見つけましたが、特定されていない理由で機能していません...つまり、Python プロンプトから:

call(['echo', '\"-s letter -T 24mm -R 24mm -B 0mm -g ~/my.html /tmp/my1.pdf\"', '|', 'nc', 'localhost', '7000'])

私は得る:

"-s letter -T 24mm -R 24mm -B 0mm -g ~my.html /tmp/my1.pdf" | nc localhost 7000
0

0 は、成功したと考えていることを示しています... しかし、bash 自体から同じステートメントを実行する場合とは異なり、wkhtmltopdf デーモンからは何も出てきません。印刷物には含まれていないので、余分な「エコー」をそこに貼り付けてみましたが、同じ結果です。

つまり...どういうわけか、これはbashプロンプトに直接入力した場合と同じ方法で物事を行うことにはなりません。

アイデア?専門知識?

ありがとう!

4

1 に答える 1

1

問題を解決するには、シェルechoを介して呼び出すことは実行可能ですが、非現実的な方法です。nc

代わりに、私はそうします

def call_7000(*a):
    import socket
    s = socket.create_connection(('localhost', 7000))
    s.write(" ".join(str(i) for i in a)
    s.close()

これを次のように呼び出すことができます

call_7000("-s letter -T 24mm -R 24mm -B 0mm -g ~my.html /tmp/my1.pdf")

またはとして

(ただし、「~/my.html」が機能するかどうかはわかりませんos.expanduser('~/my.html')。代わりに実行する必要があります。)

あなたもできる

def call_7000(*args, **kwargs):
    import socket
    import itertools
    s = socket.create_connection(('localhost', 7000))
    items = itertools.chain(" ".join("-%s %s" % (k, v) for k, v in kwargs), a)
    s.write(" ".join(str(i) for i in items)
    s.close()

そしてそれを呼び出す

call_7000("/tmp/my1.pdf", s="letter", T="24mm", R="24mm", B="0mm", g="~/my.html")

オプションの順序が適切でない場合。

于 2013-10-26T07:10:30.367 に答える