由于其依赖 pty module ,所以 Pexpect 还不能在 Windows 的标准 python 环境中执行,如果想在 Windows 平台使用,可以使用在 Windows 中运行 Cygwin 做为替代方案。
import os,sys from pexpect import * print 'run("ls") have not log!' run("ls") print 'logfile = run("ls") : log is in logfile!' log = run("ls") print log, print 'run("ls",logfile=sys.stdout): log standard output' run("ls",logfile=sys.stdout) (command_output, exitstatus) = run ('ls -l /bin', withexitstatus=1) #capture exit status run ('scp foo [email protected]:.', events={'(?i)password': mypassword}) #很实用
child = pexpect.spawn ('/usr/bin/ftp') #执行ftp客户端命令 child = pexpect.spawn ('/usr/bin/ftp', []) #使用一个参数的列表 fout = file('mylog.txt','w') child.logfile = fout #指定了 Pexpect 产生的日志的记录位置 child.logfile = sys.stdout #log标准输出 child.logfile_send = sys.stdout #不记录向子程序输入的日志,只记录子程序的输出
注意:Pexpect不支持管道,重定向或者通配符wild cards(如*)。如果需要使用,需重新打开一个shell
child = pexpect.spawn('/bin/bash -c "ls -l | grep LOG > log_list.txt"')
expect() 在执行中可能会抛出两种类型的异常分别是 EOF and TIMEOUF,其中 EOF 通常代表子程序的退出, TIMEOUT 代表在等待目标正则表达式中出现了超时。
try: index = pexpect (['good', 'bad']) if index == 0: do_something() elif index == 1: do_something_else() except EOF: do_some_other_thing() except TIMEOUT: do_something_completely_different()
child = pexpect.spawn('/bin/ls /') child.expect (pexpect.EOF) print child.before此时 child.before 保存的就是在根目录下执行 ls 命令的结果。
send(self, s) sendline(self, s='') sendcontrol(self, char)这些方法用来向子程序发送命令,模拟输入命令的行为。 与 send() 不同的是 sendline() 会额外输入一个回车符 ,更加适合用来模拟对子程序进行输入命令的操作。 当需要模拟发送 “Ctrl+c” 的行为时,还可以使用 sendcontrol() 发送控制字符。
child.sendcontrol('c') #执行 ctrl+c
由于 send() 系列函数向子程序发送的命令会在终端显示,所以也会在子程序的输入缓冲区中出现,因此不建议使用 expect 匹配最近一次 sendline() 中包含的字符。否则可能会在造成不希望的匹配结果。
参考资料:http://www.ibm.com/developerworks/cn/linux/l-cn-pexpect1/