2013-10-26 59 views
1

這裏有一個小衆場景,並且要直接測試,你需要wkhtmltopdf(在這種情況下監聽端口7000 w/--read-args-from-stdin)並作爲守護進程運行(以及一個方便的html文件手)爲什麼subprocess.call()沒有按預期運行命令?

如果我這樣做:

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

管道是由一個shell處理的,默認情況下'subprocess.call'不使用。使用'subprocess.call('command | stuff',shell = True)'。 – Blender

+0

ooooooh;非常感謝你 –

回答

1

要解決您的問題,請通過shell調用echonc是可行但不切實際的方法。

相反,我會做

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") 

稱,如果選項的順序是不相關的。