python pexpect安装问题

本文详细介绍如何在Ubuntu上解决pexpect安装问题,包括依赖模块ptyprocess的安装,以及使用pexpect进行SSH远程登录并执行命令的Python脚本示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装

https://pypi.python.org/pypi/pexpect 
下载pexpect 4.0.1 
放到ubuntu中解压 
tar -xzvf pexpect 4.0.1.tar.gz 
到达相应路径 
python ./setup.py install 
即可安装 
安装时候报了个错

SyntaxError: ('invalid syntax', ('/usr/local/lib/python2.7/dist-packages/pexpect/async.py', 16, 30, '    transport, pw = yield from asyncio.get_event_loop()\\\n'))

查了查没结果 
直接进入python环境import pexpect试试 
发现有问题

>>> import pexpect
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pexpect/__init__.py", line 75, in <module>
    from .pty_spawn import spawn, spawnu
  File "pexpect/pty_spawn.py", line 11, in <module>
    import ptyprocess
ImportError: No module named ptyprocess

少了个模块, 
https://pypi.python.org/pypi/ptyprocess#downloads 
下了个ptyprocess 
一样解压,安装, 
之后import pexpect没问题,可以用了。

或者用pip安装 
安装pip

$ sudo apt-get install python-pip python-dev build-essential 
$ sudo pip install --upgrade pip 
$ sudo pip install --upgrade virtualenv 

然后安装pexpect 
sudo pip install pexpect

pexpect and SSH

可以用pexpect来进行ssh访问 
先给脚本

import pexpect

def sudo(ssh_cmd, passwd):
    message="error"
    ret = -1
    ssh = pexpect.spawn(ssh_cmd) 
    try:
        i = ssh.expect(['continue connecting (yes/no)?', 'password:'], timeout=5)
        ssh.sendline('yes\n')       
        i = ssh.expect(['password:'],timeout=5)
        ssh.sendline(passwd)
        #ssh.expect(pexpect.EOF)
        #print ssh.before
        #print ssh.after
        r = ssh.read()
        message = r 
        ret = 0
    except pexpect.EOF:
        message = "" 
        ret = 0 
    except pexpect.TIMEOUT:
        message = "timeout" 
        ret = -2
    finally : 
        ssh.close( ) 
    return ret, message     

ssh_cmd="ssh X.X.X.X\n ifconfig"
passwd="XXXX"
ret, message=sudo(ssh_cmd, passwd)
print ret,message

很简单的一个小脚本,通过IP和密码SSH远程登录X.X.X.X机器,查看其网卡配置。 
这里

#导入模块
import pexpect
# 为 ssh 命令生成一个 spawn 类的子程序对象.
ssh = pexpect.spawn(ssh_cmd) 
#获取输出,为前者则i=0,后者则i=1
i = ssh.expect(['continue connecting (yes/no)?', 'password:'], timeout=5)
#输入
ssh.sendline(passwd)
#获取执行命令的输出
r = ssh.read()

输出为

eth0      BLABLA

lo        BLABLA
--------------------- 

### 使用 `pexpect` 模块进行交互式命令行操作 #### 创建子进程并发送指令 为了启动一个新的子进程并与之通信,可以使用 `spawn` 方法。此方法接受想要运行的程序及其参数作为输入。 ```python import pexpect child = pexpect.spawn('/bin/bash', ['-c', 'echo Hello World']) print(child.read().decode()) ``` 这段代码创建了一个新的 Bash shell 实例,并传递了一条简单的 echo 命令给它[^4]。 #### 处理预期输出 当与外部应用程序互动时,通常不知道对方会返回什么确切的信息。因此,在编写脚本之前先考虑好可能遇到的各种情况是很重要的。这可以通过调用 expect() 函数来实现,该函数允许指定多个模式匹配选项以及相应的超时期限。 ```python child = pexpect.spawn('ssh user@hostname') index = child.expect(['yes/no', 'assword:', pexpect.EOF], timeout=30) if index == 0: child.sendline('yes') # 对于新主机密钥确认提示回应 "yes" elif index == 1: child.sendline('mypassword') # 发送密码以响应身份验证请求 else: print("Connection failed or no password required.") ``` 上述例子展示了如何处理 SSH 登录过程中可能出现的不同类型的提示信息[^5]。 #### 执行远程命令 一旦建立了连接并且进入了目标系统的 Shell 环境之后,就可以继续向其发出其他命令了。需要注意的是,某些长时间运行的任务可能会因为默认设置的时间限制而提前终止;这时应该适当调整时间间隔以适应实际需求。 ```python child.sendline('ls -la') # 向已建立好的SSH session发送列表目录命令 child.expect('# ') # 等待直到看到下一个命令行符表示上一条命令已完成执行 output = child.before.decode() print(output.strip()) # 输出结果去除多余空白字符后显示出来 ``` 对于那些预计耗时较长的操作(例如文件传输),记得增加合理的等待周期以免中途被打断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值