Python vs bash stderr stdout缓冲

时间:2017-03-10 16:43:14

标签: python bash buffer stdout stderr

如何使我的python脚本在stderr和stdout缓冲方面表现得像bash一样? Bash正在缓冲stderr和stdout,以便打印的消息按时间顺序显示。下面的示例脚本说明了该行为。在Ubuntu 14.04上使用Python 2.7进行测试。

cstderr.c

#include <stdio.h>
#include <stdlib.h>
main()
{
    fprintf(stderr, "C out to stderr\n");
    exit(0);
}

bash_stderr.sh

echo Before C cstderr
./cstderr.out
echo After C cstderr

py_stderr.py

#!/usr/bin/env python

import subprocess
print("Before C cstderr")
subprocess.check_call("./cstderr.out")
print("After C cstderr")

Bash行为

$ ./bash_stderr.sh > outfile 2>&1
$ cat outfile
Before C cstderr
C out to stderr
After C cstderr

Python行为

$ ./py_stderr.py > outfile 2>&1
$ cat outfile 
C out to stderr
Before C cstderr
After C cstderr

2 个答案:

答案 0 :(得分:2)

Bash在执行任何外部程序之前刷新stdout。 Python没有。要获得所需的行为,请在sys.stdout.flush()之前立即致电subprocess.check_call()

答案 1 :(得分:2)

在python&#39; miscellaneous options部分中查找-u选项。它强制标准输入,输出和错误无缓冲,因此不需要刷新。

对于它的价值,即使没有-u选项,您的程序似乎也可以在我的Ubuntu 4.2.0-42通用系统上按预期工作而无需修改Python 2和3。 / p>