打开管道上的缓冲问题,写入文件



我有一个脚本,可以打开一个启动外部程序的进程。 外部程序写入标准输出,在父程序中,我同时写入标准输出和文件。 打印到标准输出是即时的,但打印到文件是缓冲的。在将其转储到文件之前,它必须等待某种 Xk 数字。 我已经尝试过对输出文件、管道、标准输出进行自动刷新,并且还使用 stdbuf。 但是没有任何效果,因为它只在块消息中写入文件。 我错过了什么吗?

my $output = "/home/output.log";
open(OL,">$output");
OL->autoflush(1);
open(P,'-|',"stdbuf -o0 -e0 external_program.py 2>&1");
$| = 1;
P->autoflush(1);
STDOUT->autoflush(1);
while(<P>) {
chomp;
print OL "$_n";
print "$_n";
}
close(OL);
close(P);

我不确定为什么stdbuf不起作用,但您可以使用 改为unbuffer命令。下面是一个简单的示例:

use feature qw(say);
use strict;
use warnings;
my $output = "output.log";
open(my $OL,">", $output) or die "Could not open file '$output': $!";
my $pid = open (my $P, '-|', "unbuffer test.pl 2>&1");
while(<$P>) {
chomp;
print $OL "$_n";
print "$_n";
}
close $OL;
close $P;

其中test.pl给出为:

#! /usr/bin/env perl
use strict;
use warnings;
for (1..5) {
print "Hellon";
sleep 1;
}

您可以在 Ubuntu 上安装unbuffer命令,并sudo apt-get install expect

如果没有上述脚本中的unbuffer命令,所有带有Hello的五行将在终端窗口中 5 秒后立即打印。使用unbuffer命令时,每秒都会出现一个带有Hello的新行。

更新

既然你的脚本被命名为external_program.py我假设它是一个python程序?然后有一个-u命令行选项可以python关闭缓冲,您可以使用此选项而不是运行unbuffer

> Hakon,我已经运行了"python3.6 -u external_program.py"。 我终于找到了一些有用的东西。 如果我将打印更改为文件以在每次写入一行时刷新,那么它可以工作

所以我替换以下内容:

OL "$_n";<br>
with
OL->printflush("$_n");

最新更新