2012-04-12 69 views
3

我在嘗試瞭解子處理模塊,因此正在製作一臺hlds服務器管理員。Popen子處理問題

我的目標是能夠啓動服務器實例並通過dispatcher.py發送所有命令來管理多個服務器,例如,發送命令給子進程stdin。

什麼我目前得到了初步的測試,但已經得到了堅持:]

#dispatcher.py 
import subprocess 

RUN = '/home/daniel/hlds/hlds_run -game cstrike -map de_dust2 -maxplayers 11' 
#RUN = "ls -l" 

hlds = subprocess.Popen(RUN.split(), stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) 

print hlds.communicate()[0] 

print hlds.communicate()[1] 

hlds.communicate('quit') 

我沒有收到來自HLDS服務器的任何標準輸出,但如果我不設定標準輸出到它工作正常管。並且hlds.communicate('quit')似乎也不會被髮送到hlds進程標準輸入。 ls -l命令正確返回stdout,但不是hlds。

所有幫助表示感謝! :)

回答

3

Popen.communicate docs(重點煤礦):

與互動的過程:將數據發送至標準輸入。從stdout和stderr中讀取數據,直到達到文件結尾。 等待進程終止。可選的輸入參數應該是要發送到子進程的字符串,如果沒有數據應該發送給子進程,則爲None。

所以,你只能叫communicate一次每一個進程的運行,因爲它等待進程終止。這就是爲什麼ls -l似乎工作 - 它立即終止,而hlds不會。如果你想在quit發送和獲取所有輸出,直到它結束

out, error = hlds.communicate('quit') 

你需要做的。

如果您需要更多的交互性,您需要直接使用hlds.stdout, hlds.stdin, and hlds.stderr