首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从open3读取HANDLE_IN和HANDLE_ERR

从open3读取HANDLE_IN和HANDLE_ERR
EN

Stack Overflow用户
提问于 2013-05-06 22:39:25
回答 2查看 60关注 0票数 0

我正在使用Open3来执行我的python脚本,我想看看handle_out和handle_error的输出,我怎么才能看到它呢?.I正在做类似下面的事情?它打印出来

代码语言:javascript
复制
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";

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-07 00:50:24

不需要使用IO::Select。这些只是普通的文件句柄,就像其他的一样。

代码语言:javascript
复制
while (my $line = <HANDLE_OUT>) {
    print $line;
}

不过,使用现代风格会更好,就像IPC::Open3的文档中介绍的那样。

代码语言:javascript
复制
my ($wtr, $rdr, $err);
use Symbol 'gensym'; $err = gensym;
$pid = open3($wtr, $rdr, $err,
    'some cmd and args', 'optarg', ...);

下面的内容证明了上面的建议是错误的,因为它会导致死锁。由于上述建议,下面的程序永远不会退出:

代码语言:javascript
复制
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);
'
票数 0
EN

Stack Overflow用户

发布于 2013-05-07 04:05:47

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

如果您想独立读取子进程的STDOUT和STDERR,或者同时从子进程发送和接收数据,则会遇到死锁。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16401119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档