pexpect中interact模式的坑

截止写这篇博文为止,根据官方文档,调用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,在交互式输入中,输入会被输出覆盖掉。目前还没好的解决办法

你可能感兴趣的:(python,开发语言)