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
另请注意:如果合并 stderr
和 stdout
,则可以使用 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;
我有一段 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
另请注意:如果合并 stderr
和 stdout
,则可以使用 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;