簡體   English   中英

使用 Python 通過 STDIN/STDOUT 啟動和控制外部進程

[英]Starting and Controlling an External Process via STDIN/STDOUT with Python

我需要啟動一個外部進程,該進程將通過 stdin 和 stdout 來回發送的消息進行控制。 使用 subprocess.Popen 我能夠啟動該過程,但無法根據需要通過 stdin 控制執行。

我試圖完成的流程是:

  1. 啟動外部進程
  2. 迭代一些步驟
    1. 通過向其 stdin 寫入換行符,告訴外部進程完成下一個處理步驟
    2. 等待外部進程通過向其標准輸出寫入換行符來表示它已完成該步驟
  3. 關閉外部進程的 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.spawnProcessLineReceiver

暫無
暫無

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

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