0

我正在使用 open 3 来执行我的 python 脚本 我想查看 handle_out 和 handle_error 的输出 我如何才能看到它。我正在做类似下面的事情?它打印

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";

谢谢

4

2 回答 2

2

open3仍然是一个相当低级的解决方案。它为你处理了很多事情,但它不能帮助你处理进程间通信(ipc)。

如果你想独立地从孩子的 STDOUT 和 STDERR 中读取,或者如果你同时从孩子发送和接收数据,你就会遇到死锁。

虽然可以select用来避免死锁,但它非常复杂。我不建议你走那条路。我建议您使用IPC::Run3(最简单)或IPC::Run(更多功能)而不是open3,绕过整个问题。

于 2013-05-06T20:05:47.470 回答
0

您不需要使用 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-06T16:50:23.677 回答