[英]Starting and Controlling an External Process via STDIN/STDOUT with Python
我需要啟動一個外部進程,該進程將通過 stdin 和 stdout 來回發送的消息進行控制。 使用 subprocess.Popen 我能夠啟動該過程,但無法根據需要通過 stdin 控制執行。
我試圖完成的流程是:
到目前為止,我提出了以下幾點:
process = subprocess.Popen([PathToProcess], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
for i in xrange(StepsToComplete):
print "Forcing step # %s" % i
process.communicate(input='\n')
當我運行上面的代碼時,'\\n' 沒有傳達給外部進程,我永遠不會超過第 0 步。 代碼在 process.communicate() 處阻塞,不再繼續。 我錯誤地使用了communication() 方法?
另外,我將如何實現“等待外部進程寫入新行”的功能?
process.communicate(input='\\n') 是錯誤的。 如果您會從 Python 文檔中注意到,它會將您的字符串寫入孩子的標准輸入,然后讀取孩子的所有輸出,直到孩子退出。 來自 doc.python.org:
Popen.communicate(input=None) 與進程交互:將數據發送到標准輸入。 從 stdout 和 stderr 讀取數據,直到到達文件結尾。 等待進程終止。 可選的輸入參數應該是要發送到子進程的字符串,如果沒有數據應該發送到子進程,則為 None。
相反,您只想寫入孩子的標准輸入。 然后在你的循環中讀取它。
更像是:
process=subprocess.Popen([PathToProcess],stdin=subprocess.PIPE,stdout=subprocess.PIPE);
for i in xrange(StepsToComplete):
print "Forcing step # %s"%i
process.stdin.write("\n")
result=process.stdout.readline()
這將做一些更像你想要的。
你可以使用雙絞線,用reactor.spawnProcess和LineReceiver 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.