io重定向的奇怪行为

时间:2012-03-08 10:32:21

标签: python bash

我有一个简单的脚本,可以将一些消息打印到控制台,

#!/usr/bin/python
import sys
print >>sys.stdout, "1 stdout"
print >>sys.stderr, "2 stderr"

正常序列,

[dyno@cola:codes]$ ./x.py
1 stdout
2 stderr

[dyno@cola:codes]$ ./x.py 2>&1
1 stdout
2 stderr

输出错误的顺序,

[dyno@cola:codes]$ ./x.py &>x.txt
[dyno@cola:codes]$ cat x.txt
2 stderr
1 stdout
[dyno@cola:codes]$ ./x.py 2>&1 | tee x.log
2 stderr
1 stdout

似乎添加sys.stdout.flush()可以解决问题,是否有办法强制消息序列(将输出/错误重定向到文件)而不更改脚本?

1 个答案:

答案 0 :(得分:4)

您可以使用-u标志运行python以强制stdin,stdout和stderr无缓冲。这样做会导致性能下降。最好在你希望所有东西“立即可见”的任何一点做明确的.flush()操作,因为它更有效率,并且因为它使你的意图显而易见(“这应该立即可见!”)。 p>