Python Perl 代码

Python code to Perl

我有一段 python 代码,我需要将其转换为 perl,但不幸的是我的 perl 并不好,如果问题很简单,请见谅。 我想检查特定单词的 STDOUT 和 STDERR。这是 python 代码:

p = subprocess.Popen("bmod -b " + beginTime + " " + job_id + "; exit 1;", 
stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

while p.poll() is None:
    err = p.stderr.readline().decode('utf_8')
    out = p.stdout.readline().decode('utf_8')
    if "changed" in err or "changed" in out:
        subprocess.Popen("echo rescheduling was successful!", shell=True)
os._exit(0)

我阅读了一些文档并且 open3 函数可能在这里工作,但是对于 p.poll() 部分我不确定要使用什么。

答案取决于在从 bmod 打印行后立即打印消息 "rescheduling was successful!" 是否重要(当 bmod 仍然是 运行 时)或者如果在 bmod 退出后打印该行就足够了。

最后一个案例在Perl中实现起来很简单,例如:

my $out = qx/bmod -b $beginTime $job_id 2>&1/;
say "rescheduling was successful!" if $out =~ /changed/;

关于第一种情况,如果您需要立即打印消息(甚至在 bmod 退出之前),请首先注意您的 Python 脚本可能无法正常工作。行 p.stderr.readline() 将阻止脚本,直到准备好从 p.stderr 读取一行,类似地,p.stdout.readline() 将阻止脚本,直到准备好从 p.stdout 读取一行.因此,如果 bmod 只打印到 stdout 而没有任何内容到 stderr,脚本将在第一次调用 p.stderr.readline() 时挂起,并且只有 return 当 [=13] =] 退出。

我不确定如何在 Python 中正确执行此操作,但在 Perl 中您可以使用 IPC::Open3 combined with IO::Select. See for example: Perl select return “bad file descriptor” error

另请注意:如果合并 stderrstdout,则可以使用 open 在 Perl 中实现更简单的解决方案:

my $pid = open ( my $fh, '-|', "bmod -b $beginTime $job_id 2>&1" ) or die "Could not run command: $!";
while ( my $line = <$fh> ) {
     print $line if $line =~ /changed/;
}
close $fh;