给定以下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
在这里不起作用。 最佳答案
默认情况下,Python的print()
函数将其输出定向到 sys.stdout
,其文档中指定了以下内容:
请注意,这些文档在stdbuf
的缓冲模式下不会为一般的环境影响留出余地,例如sys.stdout
命令的影响:如果使用-u
选项(或者等效地,如果设置了环境变量PYTHONUNBUFFERED
,则它是无缓冲的) ,否则为行缓冲(如果是交互式的话)和块缓冲(如果为非交互式)。
stdbuf
的文档承认,程序可以控制自己的缓冲:
由于Python明确指定了缓冲详细信息,因此可以合理地期望它确实肯定地管理其缓冲,从而消除stdbuf
的任何影响。