我正在使用Open3来执行我的python脚本,我想看看handle_out和handle_error的输出,我怎么才能看到它呢?.I正在做类似下面的事情?它打印出来
sel : IO::Select=ARRAY(0x18e15040)
local (*HANDLE_IN, *HANDLE_OUT,*HANDLE_ERR);
open3( \*HANDLE_IN, \*HANDLE_OUT, \*HANDLE_ERR, "@args") or die "open3 failed $!\n";
my $sel = new IO::Select;
$sel->add(\*HANDLE_OUT,\*HANDLE_ERR);
print "sel : $sel";谢谢
发布于 2013-05-07 00:50:24
不需要使用IO::Select。这些只是普通的文件句柄,就像其他的一样。
while (my $line = <HANDLE_OUT>) {
print $line;
}不过,使用现代风格会更好,就像IPC::Open3的文档中介绍的那样。
my ($wtr, $rdr, $err);
use Symbol 'gensym'; $err = gensym;
$pid = open3($wtr, $rdr, $err,
'some cmd and args', 'optarg', ...);下面的内容证明了上面的建议是错误的,因为它会导致死锁。由于上述建议,下面的程序永远不会退出:
perl -MIPC::Open3=open3 -E'
my $pid = open3(
local *TO_CHILD,
local *FROM_CHILD,
local *FROM_CHILD_ERROR,
"perl",
"-E" => q{say STDERR "x"x(64*1024); say "y";},
);
say "Getting STDOUT";
print while <FROM_CHILD>;
say "Getting STDERR";
print while <FROM_CHILD_ERR>;
waitpid($pid, 0);
'发布于 2013-05-07 04:05:47
open3仍然是一个相当低级的解决方案。它可以为您处理很多事情,但它不能帮助您处理进程间通信(ipc)。
如果您想独立读取子进程的STDOUT和STDERR,或者同时从子进程发送和接收数据,则会遇到死锁。
虽然可以使用select来避免死锁,但这是非常复杂的。我不建议你走这条路。我建议您使用IPC::Run3 (最简单)或IPC::Run (更多功能),而不是open3,从而绕过整个问题。
https://stackoverflow.com/questions/16401119
复制相似问题