WEB开发网
开发学院软件开发Python 探索 Pexpect,第 1 部分:剖析 Pexpect 阅读

探索 Pexpect,第 1 部分:剖析 Pexpect

 2009-08-29 00:00:00 来源:WEB开发网   
核心提示: spawn() 参数的限制在使用spawn执行命令时应该注意,Pexpect 并不与 shell 的元字符例如重定向符号 > 、>> 、管道 | ,探索 Pexpect,第 1 部分:剖析 Pexpect(8),还有通配符 * 等做交互,所以当想运行一个带有管道的命令时必须另外

spawn() 参数的限制

在使用spawn执行命令时应该注意,Pexpect 并不与 shell 的元字符例如重定向符号 > 、>> 、管道 | ,还有通配符 * 等做交互,所以当想运行一个带有管道的命令时必须另外启动一个 shell ,为了使代码清晰,以下示例使用了参数列表例如:

清单 21. 启动新的 shell 执行命令

shell_cmd = 'ls -l | grep LOG > log_list.txt' 
child = pexpect.spawn('/bin/bash', ['-c', shell_cmd]) 
child.expect(pexpect.EOF) 

与线程共同工作

Perl 也有 expect 的模块 Expect-1.21,但是 perl 的该模块在某些操作系统例如 fedora 9 或者 AIX 5 中不支持在线程中启动程序执行以下实例试图利用多线同时程登录到两台机器进行操作,不使用线程直接调用时 sub1() 函数可以正常工作,但是使用线程时在 fedora9 和 AIX 5 中都不能正常运行。

清单 22. perl 使用 expect 由于线程和 expect 共同使用导致不能正常工作的程序

use threads; 
use Expect;  
$timeout = 5;  
my $thr = threads->create(\&sub1(first_server));  
my $thr2 = threads->create(\&sub1(second_server));  
sub sub1  
{  
    my $exp = new Expect;  
    $exp -> raw_pty(1);  
    $exp -> spawn ("telnet",$_[0]) or die "cannot access telnet"; 
    $exp -> expect ( $timeout, -re=>'[Ll]ogin:' );  
    $exp -> send ( "user\n");  
    $exp -> expect ( $timeout, -re=>'[Pp]assword:' );  
    $exp -> send ( "password\n" );  
    $exp -> expect ( $timeout, -re=>" #" );  
    $exp -> send ( "date\n" ); 
    $exp -> expect ( $timeout, -re=>'\w\w\w \w\w\w \d{1,2} 
              \d\d:\d\d:\d\d \w\w\w \d\d\d\d');  
    $localtime=$exp->match(); 
    print "\tThe first server’s time is : $localtime\n";  
    $exp -> soft_close (); 
}  
print "This is the main thread!";  
$thr->join(); 
$thr2->join(); 

上一页  3 4 5 6 7 8 9  下一页

Tags:探索 Pexpect 部分

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接