截止写这篇博文为止,根据官方文档,调用interact模式时需要将logfile设置为None,否则日志会在终端显示两次(logfile_read一次,logfile一次),将logfile_read或者logfile_send设置为None是无效的(仍然会显示两次)。但是将logfile设置为None,logfile_sendy设置为sys.stdout又会报错。因此想到了如下的解决方法:
import sys
import pexpect
class sysStdoutAdaptor(object): # 标准输入输出适配器
def __init__(self):
super().__init__()
self.file = sys.stdout
def write(self, data: bytes):
strs = str(data, encoding="utf-8")
self.file.write(strs)
def flush(self):
self.file.flush()
process = pexpect.spawn("./xxxx") # 可执行文件或者命令
# process.logfile_read = None
process.logfile_send = sysStdoutAdaptor() # logfile send不能设置为None,否则无法在终端看到自己的输入
process.logfile = None # 将logfile设置为None,避免影响终端的打印
process.interact() # 进入交互模式
注意,上面这个代码有个bug,在交互式输入中,输入会被输出覆盖掉。目前还没好的解决办法