我如何使我的python脚本表现得像bash对stderr and stdout缓冲?Bash正在缓冲Stderr和Stdout,因此按时间顺序出现印刷消息。下面的示例脚本说明了行为。用python 2.7在Ubuntu上测试14.04。
cstderr.c
#include <stdio.h>
#include <stdlib.h>
main()
{
fprintf(stderr, "C out to stderrn");
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_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
在执行任何外部程序之前,击打flushes stdout。Python没有。要获得所需的行为,请在subprocess.check_call()
之前立即致电sys.stdout.flush()
。
在Python的其他选项部分中查找-u
选项。它迫使标准输入,输出和错误被禁止,因此不需要冲洗。
对于它的价值,您的程序在我的Ubuntu 4.2.0-42代系统上似乎在没有修改的情况下可以按预期工作,即使没有-u
选项。