Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 从open3中读取句柄和句柄错误_Perl - Fatal编程技术网

Perl 从open3中读取句柄和句柄错误

Perl 从open3中读取句柄和句柄错误,perl,Perl,我使用Open3来执行我的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

我使用Open3来执行我的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";

谢谢

您不需要使用IO::Select。这些只是普通的文件句柄

while (my $line = <HANDLE_OUT>) {
    print $line;
}

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

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);
'
perl-MIPC::Open3=Open3-E'
我的$pid=open3(
本地*至_儿童,
本地*来自_CHILD,
本地*来自子项错误,
“perl”,
“-E”=>q{say STDERR“x”x(64*1024);say“y”;},
);
说“正在做某事”;
边打印边打印;
说“获取标准”;
边打印边打印;
waitpid($pid,0);
'

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

如果您希望独立地读取子对象的STDOUT和STDERR,或者如果您同时从子对象发送和接收数据,则会遇到死锁


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

实际上,如果您想避免死锁,您确实需要使用
select
(或线程或非阻塞句柄)看到您接受了这个答案,我想您没有看到我的评论或不相信我,因此,我在答案中添加了一个片段,说明了为什么这个答案是错误的。另外,
open3
在传递词法句柄时有一些错误。虽然我建议在其他时间使用词汇句柄,但OP应该继续在
open3
中使用globals。
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);
'