Python使用pexpect调用终端应用时如何正确发送字符串
问题根因
pexpect 的spawn实例默认工作在二进制模式下,直接传递字符串给sendline()方法会出现类型不匹配,导致内容发送失败,你代码里返回的b''空字节对象也验证了当前是二进制工作模式。
解决方案
方案1:指定编码让pexpect自动处理字符串(推荐)
在初始化spawn实例时指定encoding参数,让pexpect自动完成字符串和字节流的编解码转换,无需手动处理编码:
import pexpect import sys # 新增encoding=utf-8参数,开启文本模式 child = pexpect.spawn("./helium-wallet create basic --seed mobile", encoding="utf-8") # 文本模式下直接绑定sys.stdout即可,不需要用buffer child.logfile_read = sys.stdout child.expect("Space separated seed words: ") # 直接传字符串即可,pexpect会自动编码 child.sendline("carpet again stick economy finish recipe blouse forward program stumble need ginger") # 等待命令执行完成输出所有结果 child.expect(pexpect.EOF) print(child.before)
方案2:手动编码字符串为字节流发送
如果你不想修改spawn的初始化参数,也可以在调用sendline时手动将字符串编码为utf-8字节流:
import pexpect import sys child = pexpect.spawn("./helium-wallet create basic --seed mobile") child.logfile_read = sys.stdout.buffer child.expect("Space separated seed words: ") # 手动将字符串编码为字节后发送 child.sendline("carpet again stick economy finish recipe blouse forward program stumble need ginger".encode("utf-8")) child.expect(pexpect.EOF) print(child.before)
两种方案执行后都可以正常拿到helium-wallet返回的完整创建结果,不会再出现空字节输出的问题。
内容的提问来源于stack exchange,提问作者Lucian Blaga
相关产品推荐
相关产品推荐

