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