Python 为什么不是';不希望正确地使用shell的输出吗?

Python 为什么不是';不希望正确地使用shell的输出吗?,python,pexpect,Python,Pexpect,我正在运行Solaris 5-10、python 2.6.2和pexpect 2.4 下面是一个非常简单的python脚本,它练习了从shell发送和接收文本的功能 我的理解是,pexepect([pexpect.TIMEOUT,x,y,z],TIMEOUT=w)将返回自上次调用pexpect以来找到的匹配的索引,但如果它花费的时间超过w秒,它将返回0 以下是我非常简单的脚本: #!/usr/bin/env python import pexpect myPrompt = " % "

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

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

我的理解是,pexepect([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 
================================================================================ 

为什么我看到“垃圾-0”总是在输出中重复出现?它应该被第一个myShell.expect()语句使用,但它一直显示。为什么

您发布的示例中发生的是对pexpect输出的错误处理。当pexpect找到与expect表达式匹配的内容时,它会使用正确的值填充之前的匹配之后的字段。pexpect文档中的这段引用可能有助于:

找到匹配项后,将设置实例属性“before”、“After”和“match”。您可以在“before”中查看匹配之前读取的所有数据。您可以在“之后”中看到匹配的数据。重新匹配中使用的re.MatchObject将位于“match”中。如果发生错误,则“before”将设置为迄今为止读取的所有数据,“after”和“match”将为无。”

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

之前:垃圾-0 我的机器

之后:%JUNK-0

请注意,after不会被完全消耗,只有%会消失。因此,在下一次使用时,您将获得:

之前:垃圾-0 垃圾-0:未找到命令。 我的机器

之后:%1

据我所知,第一个expect(超时的expect,不在for循环中)不会消耗输出

我认为如果你改变路线:

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

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

希望这有帮助

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