Python 之 pexpect模块

发布时间:2019-09-11 07:42:51编辑:auto阅读(1698)

    python安装setuptools模块之后,便可使用easy_install来安装python的第三方扩展模块,默认安装路径是:

    /usr/lib/python2.6/site-packages/

    easy_install 模块名 #可以直接安装
    easy_install  pexpect
    [root@zhu ~]# easy_install pexpect
    Searching for pexpect
    Reading http://pypi.python.org/simple/pexpect/
    Reading http://pexpect.readthedocs.org/
    Reading http://pexpect.sourceforge.net/
    Reading http://sourceforge.net/project/showfiles.php?group_id=59762
    Best match: pexpect 3.1
    Downloading https://pypi.python.org/packages/source/p/pexpect/pexpect-3.1.tar.gz#md5=5a8e1573062e2e2c203c9a6d213b16e7
    Processing pexpect-3.1.tar.gz
    Running pexpect-3.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-KOPmVQ/pexpect-3.1/egg-dist-tmp-GnQBTg
    zip_safe flag not set; analyzing archive contents...
    Adding pexpect 3.1 to easy-install.pth file
    Installed /usr/lib/python2.6/site-packages/pexpect-3.1-py2.6.egg
    Processing dependencies for pexpect
    Finished processing dependencies for pexpect
    #由于pexpect-3.1-py2.6.egg此时仍是一个压缩文件,所以需要进行解压。
    cd /usr/lib/python2.6/site-packages/
    unzip pexpect-3.1-py2.6.egg

    pexpect是一个用来启动子程序并对其进行自动控制的python模块,可以用来和ssh,ftp,telnet等需要输入密码的命令行程序进行自动交互。

    安装过程如上。

    另一种安装方法如下:

    wget http://pexpect.sourceforge.net/pexpect-2.3.tar.gz
     tar xzf pexpect-2.3.tar.gz
     cd pexpect-2.3
     python ./setup.py install

    pexpect 模块的使用如下:

    >>> pexpect.
    pexpect.EOF(                 pexpect.__path__             pexpect.run(
    pexpect.ExceptionPexpect(    pexpect.__reduce__(          pexpect.runu(
    pexpect.PY3                  pexpect.__reduce_ex__(       pexpect.searcher_re(
    pexpect.TIMEOUT(             pexpect.__repr__(            pexpect.searcher_string(
    pexpect.__all__              pexpect.__revision__         pexpect.select
    pexpect.__class__(           pexpect.__setattr__(         pexpect.signal
    pexpect.__delattr__(         pexpect.__sizeof__(          pexpect.spawn(
    pexpect.__dict__             pexpect.__str__(             pexpect.spawnu(
    pexpect.__doc__              pexpect.__subclasshook__(    pexpect.split_command_line(
    pexpect.__file__             pexpect.__version__          pexpect.struct
    pexpect.__format__(          pexpect._run(                pexpect.sys
    pexpect.__getattribute__(    pexpect.codecs               pexpect.termios
    pexpect.__hash__(            pexpect.errno                pexpect.time
    pexpect.__init__(            pexpect.fcntl                pexpect.traceback
    pexpect.__loader__           pexpect.os                   pexpect.tty
    pexpect.__name__             pexpect.pty                  pexpect.types
    pexpect.__new__(             pexpect.re                   pexpect.which(
    pexpect.__package__          pexpect.resource

    1.pexpect.run()函数的使用

    run(command, timeout=-1, withexitstatus=False, events=None, extra_args=None, logfile=None, cwd=None, env=None)
    #默认情况下该指令:
    #1.运行给出的指令command,如果指令不是以绝对路径给出,会自动在PATH中寻找。结果输出作为字符串返回,行与行之间以\r\n分割。
    #2.withexitstatus设置为True时,结果返回一个元组,(command_output,
        exitstatus)
    #events是一个字典,有模式和应答组成,可以自动输入内容,如果应答需要输入enter键时,此时需要为一个新行,即添加\n.
    >>> pexpect.run('cat /root/a.txt')
    'qian shan\r\nniao fei jue\r\ndu diao han jiang xue\r\n'
    >>> pexpect.run('cat /root/a.txt',withexitstatus=1)
    ('qian shan\r\nniao fei jue\r\ndu diao han jiang xue\r\n', 0)
    >>> pexpect.run('scp /root/a.txt 192.168.56.102:/root',withexitstatus=1,events={'password': '123456\n'})
    ("root@192.168.56.102's password: \r\n\ra.txt                                           0%    0     0.0KB/s   --:-- ETA\ra.txt                                         100%   45     0.0KB/s   00:00    \r\n", 0)

    2.pexpect.spawn()类的使用

    spawn是Pexpect模块主要的类,用以实现启动子程序,它有丰富的方法与子程序交互从而实现用户对子程序的控制。它主要使用 pty.fork() 生成子进程,并调用 exec() 系列函数执行 command 参数的内容。

    child = pexpect.spawn ('/usr/bin/ftp') #执行ftp客户端命令
    child = pexpect.spawn ('/usr/bin/ssh user@example.com') #使用ssh登录目标机器
    child = pexpect.spawn ('ls -latr /tmp') #显示 /tmp目录内容
    child = pexpect.spawn ('/usr/bin/ftp', [])
    child = pexpect.spawn ('/usr/bin/ssh', ['user@example.com'])
    child = pexpect.spawn ('ls', ['-latr', '/tmp'])
    child = pexpect.spawn('some_command')
    fout = file('mylog.txt','w')
    child.logfile = fout
    child = pexpect.spawn('ssh root@192.168.56.102')
    child.expect(self, pattern, timeout=-1, searchwindowsize=-1)
    为了控制子程序,等待子程序产生特定输出,做出特定的响应,可以使用 expect 方法
    在参数中: pattern 可以是正则表达式, pexpect.EOF , pexpect.TIMEOUT ,或者由这些元素组成的列表。需要注意的是,当 pattern 的类型是一个列表时,且子程序输出结果中不止一个被匹配成功,则匹配返回的结果是缓冲区中最先出现的那个元素,或者是列表中最左边的元素。使用 timeout 可以指定等待结果的超时时间 ,该时间以秒为单位。当超过预订时间时, expect 匹配到pexpect.TIMEOUT。

    3.打印before的内容

    >>> child = pexpect.spawn('ls -l')
    >>> child.expect(pexpect.EOF)
    0
    >>> print child.before
    总用量 64
    drwxr-xr-x.  3 root root  4096 4月   2 10:09 aaa
    -rw-r--r--.  1 root root    45 4月   3 15:01 a.txt
    drwxr-xr-x. 16 root root  4096 3月   6 21:36 biaozhunku
    drwxr-xr-x.  2 root root  4096 3月  27 17:03 mypython
    drwxr-xr-x.  2 root root  4096 4月   3 13:21 mysource
    drwxr-xr-x.  2 root root  4096 4月   3 13:20 mywork
    drwxr-xr-x.  2 root root 36864 3月  19 11:09 pythoncook
    -rw-r--r--.  1 root root   276 4月   3 14:26 zhu.py
    #child.before 保存的就是在根目录下执行 ls 命令的结果
    send(self, s)
    sendline(self, s='')
    sendcontrol(self, char)
    这些方法用来向子程序发送命令,模拟输入命令的行为。与 send() 不同的是 sendline() 会额外输入一个回车符 ,更加适合用来模拟对子程序进行输入命令的操作。当需要模拟发送 “Ctrl+c” 的行为时,还可以使用 sendcontrol() 发送控制字符。





















关键字