2016-04-28 74 views
1

我正在研究用於在移動設備上進行自動化煙霧和單元測試的Python腳本。 iOS解決方案使用ios-deploy。因爲我在終止測試過程之前嘗試終止LLDB會話,所以我使用管道進行過程之間的通信。下面是一段代碼:Python:子進程通信失敗和終端崩潰

管道聲明:

_pipe_cmd_rcv, _pipe_cmd_snd = Pipe() 

    # Pipe to receive commands 
    self._pipe_cmd_rcv = _pipe_cmd_rcv 
    # Pipe to send commands 
    self._pipe_cmd_snd = _pipe_cmd_snd 

,我送exit命令LLDB,隨後Y確認退出的部分:

 self._pipe_cmd_snd.send("exit \n") 
     self._pipe_cmd_snd.send("Y \n") 

最後我想要接收輸入的部分:

pcs = subprocess.Popen(cmd.split(), stdin=self._pipe_cmd_rcv, stdout=subprocess.PIPE, universal_newlines=True) 

我的我注意將exit命令發送到運行LLDB的進程的stdin,但不幸的是,在整個測試過程完成後,我不能再使用我的終端。如果我輸入CTRL + C它會返回提示,並且當我按下回車鍵時,它將提示粘貼爲輸入。這就像它被困在一個循環中。我必須打開一個新的終端窗口才能以「常規方式」使用它。這是不希望的,因爲該腳本將用於在CI系統上運行。任何人都可以弄清楚我做錯了什麼?

回答

0

你已經產生了與輸入的過程中,通過self._pipe_cmd_rcv但您嘗試通過self._pipe_cmd_snd發送輸入到該進程,所以它的阻止那裏的輸入。以下可能有所幫助

self._pipe_cmd_rcv.send("exit \n") 
    self._pipe_cmd_rcv.send("Y \n") 
+0

這不起作用,因爲管道聲明會返回一個元組。你需要一個管道的兩端,一個用於發送,另一個用於接收。我想發送一個命令給進程的標準輸入,而不是從它發送 – ITiger