2016-12-04 77 views
0

我試圖從我運行在同一腳本中的tcp服務器讀取數據。我能夠發送一個命令並讀取其輸出,但最後(在讀取所有輸出之後)它看起來像程序在readline中掛起,我嘗試了幾乎所有的解決方案herehere但仍然掛起。Python子進程readline在讀取所有輸入後掛起()

大多數這些解決方案提議檢查readline的輸出是否爲none,但在我的情況下,程序永遠不會從上次讀取返回並掛在那裏。

編輯: TCP服務器不在我的控制,或者說我只是要測試服務器腳本所以不能對其進行修改。另外,是否有可能使用python發送命令到運行服務器而不使用子進程?任何更好的選擇?

def subprocess_cmd(command): 
    process=subprocess.Popen(command,stdin=subprocess.PIPE,stderr=subprocess.STDOUT,stdout=subprocess.PIPE, shell=True) 

for cmd in ['python3 -u tcp_server.py 123 port1']: 
    subprocess_cmd(cmd) 

process.stdin.write('command like print_list') 
process.stdin.flush() 
while True: 
    line=process.stdout.readline() 
    if line == '': 
     break 
+0

你必須發佈你的代碼,所以我們可以提供幫助。 –

+0

@ Jean-François添加了代碼 –

回答

1

readline掛起,因爲你的TCP連接仍然是開放的,readline需要更多數據來。你必須關閉從服務器端的連接,通知readline,沒有什麼更多的閱讀。通常這是通過關閉客戶端的套接字來完成的,通知服務器將不再有任何請求。當服務器完成處理所有命令時,它也會關閉套接字。這是您收到的信號,表示您已收到服務器發送給您的所有數據。

或者,或者,如果您不想關閉連接,則必須創建將標記響應結束的分隔符。因此,當讀取這種分隔符時,客戶端將停止呼叫readline

+0

你是對的我對此也有同感。但請閱讀我的編輯並讓我知道我能做些什麼嗎? –

+0

根據你的代碼,tcp_server.py不是一個TCP服務器。至少你使用標準的輸入/輸出流與它進行通信,而不是TCP。無論如何,原因是一樣的:你沒有關閉stdin。最好的方法是使用'subprocess.communicate'。在函數的文檔中描述了原因。 –

+0

好的感謝清除的概念。接受你的答案 –

相關問題