我有一个对象。
这个对象有一个connect()
方法可以产生一个 pexpect 进程。
产生的进程是一个自定义串行接口。启动时,此工具会打印要连接的串行设备菜单,如下所示:
libftdi 设备 (0): A6005jpt libftdi 设备 (1):acFX9DQf 串口设备(一):/dev/cu.Bluetooth-PDA-Sync 按字母选择设备(^D 中止):
我connect()
根据给定的设备名称(例如“acFX9DQf”)确定要传递的数字:(self.connection 是预期生成的)
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 设备 (0): A6005jpt 匹配设备线! libftdi 设备 (1):acFX9DQf 匹配设备线! 匹配所需的 USB 串行... 串口设备(一):/dev/cu.Bluetooth-PDA-Sync 按字母选择设备(^D 中止):1
......那么,我的一个connect()
电话会出乎意料地做......
libftdi 设备 (0): A6005jpt 匹配设备线! libftdi 设备 (1):acFX9DQf 串口设备(一):/dev/cu.Bluetooth-PDA-Sync 按字母选择设备(^D 中止): MATCHED A DEVICE LINE! <<异常>>
但是,如果我将代码修改为:
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
我的问题消失了!我可以反复运行它,不会出现任何问题——没有例外,没有任何问题。
所以这里到底发生了什么?我什至不知道从哪里开始解决这个问题。