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'
before
和 before after
行被跳过的原因是它们包含回车 return 字符 \r
和转义序列 \x1b[K
。
carriage return用于将光标移动到行首。如果要写入的字符串中后面有字符,则从光标位置开始打印它们以替换现有打印字符。
ANSI Control sequence\x1b[K
擦除光标所在位置到行尾的行。这会清除您的特定情况下已经打印的字符串。
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'
before
和 before after
行被跳过的原因是它们包含回车 return 字符 \r
和转义序列 \x1b[K
。
carriage return用于将光标移动到行首。如果要写入的字符串中后面有字符,则从光标位置开始打印它们以替换现有打印字符。
ANSI Control sequence\x1b[K
擦除光标所在位置到行尾的行。这会清除您的特定情况下已经打印的字符串。