【发布时间】:2019-09-03 09:07:44
【问题描述】:
给定以下 Python 程序:
import sys
print("input")
while True:
pass
和 C 中的等价物:
#include <stdio.h>
int main() {
printf("input\n");
while(1);
return 0;
}
当我使用cat 对程序进行管道传输时,默认情况下输出是缓冲的(而不是行缓冲的)。结果,我没有输出:
% python3 ./a.py | cat
(empty)
% ./a.out | cat
(empty)
我可以使用stdbuf 切换回行缓冲:
% stdbuf -oL ./a.out | cat
input
但这不适用于 Python:
% stdbuf -oL python3 a.py | cat
(empty)
知道为什么吗?我知道python3 -u 的存在,但我想要行缓冲,而不是“无缓冲”,我希望这个命令行也适用于其他语言。命令unbuffer 似乎也可以工作,但我想了解为什么stdbuf 在这里不起作用。
【问题讨论】:
-
来自man stdbuf 注意:如果 COMMAND 调整其标准流的缓冲(例如,'tee' 会这样做),那么它将覆盖由 'stdbuf' 更改的相应设置。还有一些过滤器(如 'dd' 和 'cat' 等)不使用流进行 I/O,因此不受 'stdbuf' 设置的影响。 我猜
python正在这样做。跨度>
标签: python c linux pipe buffer