Python pexpect:fdpexpect + pyserial ==超时不起作用?

som*_*ser 5 python automation serial-port pexpect pyserial

我正在尝试在串行端口上使用pexpect。我按照建议使用fdpexpect。但我注意到Expect()不会服从超时。而是发生了EOF。

ser = serial.Serial(sys.argv[1], 9600)
fd = fdpexpect.fdspawn(ser.fd)
fd.send('%s\r' % username)
i = fd.expect(['Password:', pexpect.TIMEOUT], timeout=30)
if i == 0:
    fd.send('%s\r' % password)
else:
    print 'Boom!'
Run Code Online (Sandbox Code Playgroud)

似乎没有抓住任何一个,而是几乎立即提高了pexpect.exceptions.EOF。如果我将pexpect.EOF添加到匹配列表中,则EOF将立即匹配。当然,这是一个串行端口,数据很可能尚未到达。如果我在fd.expect()之前添加time.sleep(1),它将起作用。但这违背了预期的目的。难道我做错了什么?

Kyl*_*ron 0

每当您使用生成的终端fdpexpect而不是普通pexpect终端时,您都必须担心会碰到该文件流的 EOF。有关更多信息,请参阅此答案:/sf/answers/1803958131/

我还发现添加maxread=1topexpect.fdpexpect.fdspawn可以帮助解决这个问题,但这也会减慢阅读文本的速度。