簡體   English   中英

為什么subprocess.call()無法按預期運行命令?

[英]why is subprocess.call() not running command as anticipated?

這里有一個小眾環境,要直接進行測試,您需要wkhtmltopdf(在這種情況下,監聽端口7000 w / --read-args-from-stdin)並作為守護程序運行(以及手頭上方便的html文件) 。)

如果我做:

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

然后非常迅速地彈出pops /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守護程序沒有任何內容。 我嘗試在其中粘貼一個額外的“ echo”,因為打印輸出不包括它,但結果相同。

所以...以某種方式,這並沒有像直接在bash提示符中鍵入時那樣吸引人。

想法? 專業知識?

謝謝!

要解決您的問題,通過外殼調用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")

如果選項的順序不相關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM