【问题标题】:pexpect python throw errorpexpect python 抛出错误
【发布时间】:2016-05-06 18:10:28
【问题描述】:

虽然这是我第一次尝试使用 pexpect,但是使用 pexpect 的 python3 脚本非常简单;但它失败了。

#!/usr/bin/env python3
import sys
import pexpect

SSH_NEWKEY = r'Are you sure you want to continue connecting \(yes/no\)\?'

child = pexpect.spawn("ssh -i /user/aws/key.pem ec2-user@xxx.xxx.xxx.xxx date")
i = child.expect( [ pexpect.TIMEOUT, SSH_NEWKEY )
if i == 1:
   child.sendline('yes')
print(child.before)

SSH_NEWKEY 是我期望的唯一响应,但该示例显示了一个包含 pexpect.TIMEOUT 的列表,因此我使用了它。

$ ./test.py 
Traceback (most recent call last):
  File "/usr/local/lib/python3.4/site-packages/pexpect/spawnbase.py", line 144, in read_nonblocking
    s = os.read(self.child_fd, size)
OSError: [Errno 5] Input/output error

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.4/site-packages/pexpect/expect.py", line 97, in expect_loop
    incoming = spawn.read_nonblocking(spawn.maxread, timeout)
  File "/usr/local/lib/python3.4/site-packages/pexpect/pty_spawn.py", line 455, in read_nonblocking
    return super(spawn, self).read_nonblocking(size)
  File "/usr/local/lib/python3.4/site-packages/pexpect/spawnbase.py", line 149, in read_nonblocking
    raise EOF('End Of File (EOF). Exception style platform.')
pexpect.exceptions.EOF: End Of File (EOF). Exception style platform.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./min.py", line 15, in <module>
    i = child.expect( [ pexpect.TIMEOUT, SSH_NEWKEY  ] )
  File "/usr/local/lib/python3.4/site-packages/pexpect/spawnbase.py", line 315, in expect
    timeout, searchwindowsize, async)
  File "/usr/local/lib/python3.4/site-packages/pexpect/spawnbase.py", line 339, in expect_list
    return exp.expect_loop(timeout)
  File "/usr/local/lib/python3.4/site-packages/pexpect/expect.py", line 102, in expect_loop
    return self.eof(e)
  File "/usr/local/lib/python3.4/site-packages/pexpect/expect.py", line 49, in eof
    raise EOF(msg)
pexpect.exceptions.EOF: End Of File (EOF). Exception style platform.
<pexpect.pty_spawn.spawn object at 0x7f70ea4fbcf8>
command: /usr/bin/ssh
args: ['/usr/bin/ssh', '-i', '/user/aws/key.pem', 'ec2-user@xxx.xxx.xxx.xxx', 'date']
searcher: None
buffer (last 100 chars): b''
before (last 100 chars): b'Fri May  6 13:50:18 EDT 2016\r\n'
after: <class 'pexpect.exceptions.EOF'>
match: None
match_index: None
exitstatus: 0
flag_eof: True
pid: 31293
child_fd: 5
closed: False
timeout: 30
delimiter: <class 'pexpect.exceptions.EOF'>
logfile: None
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1

我错过了什么?

CentOS 6.4 蟒蛇3.4.3

【问题讨论】:

    标签: python-3.4 pexpect


    【解决方案1】:

    在您的期望调用期间引发了 EOF 错误。这意味着收到的响应与 SSH_NEWKEY 不匹配,并在超时期限内到达文件末尾。要捕获此异常,您应该将 except 行更改为:

    i = child.expect( [ pexpect.TIMEOUT, SSH_NEWKEY, pexpect.EOF)
    

    然后你可以让你的 if 更健壮:

    if i == 1:
       child.sendline('yes')
    elif i == 0:
        print "Timeout"
    elif i == 2:
        print "EOF"
    print(child.before)
    

    这并不能解决您收到带有预期字符串的响应的原因 - 如果不查看更多代码很难知道,但这很可能是因为您的响应稍有错误。如果您手动输入 SSH 字符串,您应该能够看到预期的响应,并将此响应输入到您的代码中。

    您还可以在您的期望调用之后打印 child.before,或者打印 child.read() 而不是您的期望调用以查看作为响应返回的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 2023-02-19
      相关资源
      最近更新 更多