python3 pexpect spawn object 行参考被跳过

python3 pexpect spawn object line reference gets skipped

Python版本:3.8.0 预期版本:4.8.0

    def runCmd( self, cmd, thisTimeout = None ):
        output = ""
        if not thisTimeout:
            thisTimeout = self.conn.timeout
        try:
            print("debug: %s" % cmd)
            self.conn.sendline(cmd)
            print( "before: %s " % self.conn.before.decode() )
            index = self.conn.expect( self.expList, timeout = thisTimeout )
            output += self.conn.before.decode()
            print( "after: %s " % self.conn.after.decode() )
            print( "before after: %s" % self.conn.before.decode() )
        except Exception as e:
            #expect exception thrown
            print( "Error running command %s" % cmd )
            print( e )
            output = "Error: %s" % str(self.conn)
        print("yo man %s" % self.conn.before.decode() )
        output = output.replace(cmd, "").strip()
        print("this has to print %s " % output)
        return output

此函数通过 pexpect 接口执行 cmd 并 returns 输出。

有效的Python/pxpect版本: Python版本:3.6.9 预期版本:4.2.1

在 Python 3.8.0/pexpect 4.8.0 上将 python 脚本更新为 运行 后,发送给 pexpect 的第一个命令有时 returns 为空输出。原因是当变量self.conn.before.decode()被引用时,python代码没有执行或无效。

描述情况的示例输出:

debug: cat /etc/hostname
before:  
after: ubuntu@ip-172-31-1-219:~$ 


this has to print  

预期行为:

debug: cat /etc/hostname
 
after: ubuntu@ip-172-31-1-219:~$ 
before after:  cat /etc/hostname
ip-172-31-1-219

yo man  cat /etc/hostname
ip-172-31-1-219

this has to print ip-172-31-1-219

但这一次,before: 行被跳过。 这里发生了什么?! 降级是不可能的,因为 async(pexpect(<=4.2.1) used async as function/variable signature) 成为关键字。

更新: 这些行正在执行,但在我将其打印为字节字符串后它正在打印出来。

before after: b' \r\x1b[K\x1b]0;ubuntu@ip-172-31-1-219: ~\x07'

打印出正确的地方

before after: b' cat /etc/hostname\r\nip-172-31-1-219
\r\n\x1b]0;ubuntu@ip-172-31-1-219: ~\x07'

beforebefore after 行被跳过的原因是它们包含回车 return 字符 \r 和转义序列 \x1b[K

carriage return用于将光标移动到行首。如果要写入的字符串中后面有字符,则从光标位置开始打印它们以替换现有打印字符。

ANSI Control sequence\x1b[K擦除光标所在位置到行尾的行。这会清除您的特定情况下已经打印的字符串。