0

我正在运行 Solaris 5-10、python 2.6.2 和 pexpect 2.4

我在下面有一个非常简单的 python 脚本,它练习从 shell 发送和接收文本的功能。

我的理解是 pexpect([pexpect.TIMEOUT, x,y,z], timeout=w) 将返回自上次调用 pexpect 以来找到的匹配索引,但如果它花费的时间超过 w 秒,它将返回 0。

这是我非常简单的脚本:

#!/usr/bin/env python 

import pexpect 
myPrompt = " % " 

myShell = pexpect.spawn("/bin/tcsh") 
print "Sending 'JUNK-0' to shell" 
x = myShell.sendline("JUNK-0") 
y = myShell.expect([pexpect.TIMEOUT], timeout=1)               
print "y = %s" % y 
print myShell.before 
print "=" * 80 
print "\n\n" 

for i in range(2): 
    print "i = %d" % (i+1) 
    print "Sending 'JUNK-%d' to shell" % (i+1) 
    x = myShell.sendline("JUNK-%d" % (i+1)) 
    y = myShell.expect([pexpect.TIMEOUT, myPrompt], timeout=10)               
    print "y = %s" % y 
    print myShell.before 
    print "=" * 80 
    print "\n\n" 

仅供参考,我的 shell 提示符是“myMachine %”,但是在这个脚本中,我只是使用“%”来保持它的通用性。

当我运行它时,我看到以下输出:

Sending 'JUNK-0' to shell 
y = 0 
JUNK-0 
myMachine % JUNK-0 
JUNK-0: Command not found. 
myMachine % 
================================================================================ 



i = 1 
Sending 'JUNK-1' to shell 
y = 1 
JUNK-0 
myMachine 
================================================================================ 



i = 2 
Sending 'JUNK-2' to shell 
y = 1 
JUNK-0 
JUNK-0: Command not found. 
myMachine 
================================================================================ 

为什么我看到“JUNK-0”始终在输出中重复出现?它应该被第一个 myShell.expect() 语句消耗掉,但它不断出现。为什么??

4

1 回答 1

0

您发布的示例中发生的是对 pexpect 输出的错误处理。当 pexpect 找到与期望表达式匹配的内容时,它会使用正确的值填充beforematchafter的字段。pexpect 文档中的这句话可能会有所帮助:

"找到匹配后,将设置实例属性'before','after'和'match'。在'before'中可以看到匹配之前读取的所有数据。在'after'中可以看到匹配的数据'。重新匹配中使用的re.MatchObject将在'match'中。如果发生错误,则'before'将设置为到目前为止读取的所有数据,'after'和'match'将为None。

在您的情况下,第一个期望会产生以下结果:

之前:JUNK-0 myMachine

之后:% JUNK-0

请注意,after不会完全消耗,只有%会消失。因此,在您的下一个期望中,您会得到:

之前:JUNK-0 JUNK-0:找不到命令。我的机器

之后:% JUNK-1

据我所知,第一个期望(超时,超出 for 循环)不会消耗输出。

我认为如果你换行:

myShell.expect([pexpect.TIMEOUT], timeout=1)

myShell.expect([pexpect.TIMEOUT, myPrompt], timeout=1)

输出将同步,您将获得正确的输出。

希望这可以帮助。

于 2013-01-07T16:05:49.383 回答