2011-05-26 40 views
0

我有一個對象。爲什麼strip()修復這個pexpect腳本?

此對象有一個產生pexpect進程的方法connect()

產生的過程是一個自定義串行接口。在發佈時,這款工具打印串口設備的菜單來連接,像這樣:

libftdi device (0): A6005jpt 
libftdi device (1): acFX9DQf 
Serial device (a) : /dev/cu.Bluetooth-PDA-Sync 
Select a device by its letter (^D to abort):

connect()決定通過基於給定的設備名(如「acFX9DQf」)哪個號碼:(self.connection是Pexpect的產卵)

USBSERIAL_DEVICE_NAME = "acFX9DQf"  

try: 
    while self.connection.expect(['libftdi device \(([0-9])\): (.*)','Serial device']) == 0: 
     if self.connection.match.group(2).strip() == USBSERIAL_DEVICE_NAME: 
      # do stuff 
except: 
    # do stuff 

現在,我的問題是,在我的主要邏輯我connect()/kill()過程多次,有時,這樣的一個時期,connect()決定拋出一個異常pexpect.TIMEOUT,意外。

例如,當我添加下面的調試語句,以我的邏輯,像這樣:

USBSERIAL_DEVICE_NAME = "acFX9DQf" 

try: 
    while self.connection.expect(['libftdi device \(([0-9])\): (.*)','Serial device'], timeout=10) == 0: 
     print "MATCHED A DEVICE LINE!" 
     if self.connection.match.group(2).strip() == USBSERIAL_DEVICE_NAME: 
      print "MATCHED THE DESIRED USBSERIAL..." 

...我得到這個輸出的connect()很多電話:

libftdi device (0): A6005jpt 
MATCHED A DEVICE LINE! 
libftdi device (1): acFX9DQf 
MATCHED A DEVICE LINE! 
MATCHED THE DESIRED USBSERIAL... 
Serial device (a) : /dev/cu.Bluetooth-PDA-Sync 
Select a device by its letter (^D to abort): 1

...然後,我的一個connect()來電會意想不到地發生....

 
libftdi device (0): A6005jpt 
MATCHED A DEVICE LINE! 
libftdi device (1): acFX9DQf 
Serial device (a) : /dev/cu.Bluetooth-PDA-Sync 
Select a device by its letter (^D to abort): MATCHED A DEVICE LINE! 

<<EXCEPTION>>

但是,如果我修改我的代碼如下:

try: 
    while self.connection.expect(['libftdi device \(([0-9])\): (.*)','Serial device'], timeout=10) == 0: 
     devicename = self.connection.match.group(2).strip() 
     if devicename == USBSERIAL_DEVICE_NAME: 
      # do stuff 

我的問題,走開!我可以反覆運行,不會出現任何問題 - 沒有例外,沒有任何問題。

那麼在這裏呢?我甚至不知道從哪裏開始解決這個問題。

+2

好吧,你有什麼異常,以及哪些變化修復了它? – Gabe 2011-05-26 03:11:47

+0

當您介紹'devicename'時,輸出是否與第一個代碼失敗時相同(即提示後出現「MATCHED A DEVICE LINE!」)? – outis 2011-05-26 06:37:51

+0

@加貝 - 我得到一個pexpect.TIMEOUT。 – eastydude5 2011-05-26 16:54:14

回答

1

我猜你得到TIMEOUT異常。基於「匹配設備線」的位置消息在輸出中,我的假設是spawn實例在測試匹配時有多行。當pexpect編譯正則表達式時,sets re.DOTALL,所以.*包含換行符和附加行。這會導致針對USBSERIAL_DEVICE_NAME的測試失敗,並且循環繼續其下一次迭代。下一個電話expect塊,因爲沒有額外的輸入,你會得到超時。

爲了解決這個問題,你可以在自己的編譯的正則表達式通(這將缺乏re.DOTALL標誌)或更改.*所以它明確地不匹配換行符(例如,\S*)。

至於爲什麼將匹配的組存儲在一個變量中似乎可以解決問題,我只能猜測這引入了一個細微的時間變化,以防止expect的調用一次接收多行輸入。

+0

非常感謝解決方案。我的猜測是這是一個時間/觀點bugginess的事情。只是想確保我沒有錯過這裏的一些關鍵Python課程... – eastydude5 2011-05-26 16:54:49

+0

更改。*到\ S *修復它!完美的答案! – eastydude5 2011-05-26 17:07:26

+0

@eastydude:時間,是的,錯誤,沒有。 pexpect使用're.DOTALL'進行設計。我不知道原因,但它可能是修復一個錯誤。 – outis 2011-05-26 20:04:04