2009-07-06 85 views
4

我需要啓動一個外部進程,通過stdin和stdout來回發送消息來控制它。使用subprocess.Popen我能夠啓動該進程,但無法通過stdin控制執行,因爲我需要。使用Python通過STDIN/STDOUT啓動和控制外部進程

的我想要完成的流程是:

  1. 啓動外部進程
  2. 迭代對於一些數量的步驟
    1. 告訴外部程序來完成下一個處理通過在它的stdin中寫一個換行符
    2. 等待外部進程通過向它的stdout寫入換行符來完成該步驟
  3. 關閉外部進程的標準輸入以向外部進程指示執行已完成。

我想出了迄今爲止以下:

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()中的代碼塊不會繼續進行。我正在使用communications()方法嗎?

此外,我將如何實現「等到外部進程寫入新行」功能塊?

回答

8

process.communicate(input ='\ n')是錯誤的。如果您從Python文檔中注意到,它會將您的字符串寫入孩子的stdin,然後讀取孩子的所有輸出,直到孩子退出。來自doc.python.org:

Popen.communicate(input = None)與進程交互 :將數據發送到stdin。從stdout和stderr讀取 數據,直到達到 文件結束。等待 進程終止。可選的 輸入參數應該是一個字符串,將 發送給子進程,如果沒有數據應該發送給 子進程,則返回None, 。

取而代之,你想只寫信給孩子的stdin。然後在你的循環中讀取它。

更多的東西一樣:

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

這將做更多的東西一樣,你想要什麼。

+3

當我第一次這樣做的時候,有些東西會讓我咬牙切齒,如果你只發送幾個字符,你可能不得不在發送任何東西之前刷新流。 – Kiv 2009-07-06 16:20:57

相關問題