为什么strip()要修复这个pexpect脚本?

2024-06-02 05:40:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有个目标。在

此对象有一个生成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): 

Myconnect()根据给定的设备名(例如“acFX9DQf”)确定要传递的号码:(自我连接是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()意外地决定抛出一个^{}异常。在

例如,当我将以下调试语句添加到逻辑中时,如下所示:

^{pr2}$

…对于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

我的问题解决了!我可以反复运行它,不会出现任何问题-没有例外,没有什么。在

那么这到底是怎么回事?我甚至不知道从哪里开始这个问题。在


Tags: devselfdeviceconnectlineserialconnectionbluetooth
1条回答
网友
1楼 · 发布于 2024-06-02 05:40:08

我猜你得到了一个TIMEOUT异常。基于“匹配设备线!”消息在输出中,我的假设是spawn实例在测试匹配时有多行。当pexpect编译regex时,sets ^{},因此{}包括新行和附加行。这将导致针对USBSERIAL_DEVICE_NAME的测试失败,循环将继续其下一次迭代。下一个对expect的调用将阻塞,因为没有其他输入,并且您将得到一个超时。在

要解决这个问题,您可以传入自己编译的regex(这将缺少re.DOTALL标志)或更改.*,使其与换行符显式不匹配(例如\S*)。在

至于为什么将匹配的组存储在变量中似乎可以解决问题,我只能猜测这引入了一个微妙的时间变化,它阻止对expect的调用同时接收多行输入。在

相关问题 更多 >