为什么stderr打印晚于stdout?

时间:2019-01-15 07:21:06

标签: python stdout stderr

stderr没有缓冲区,而stdout有缓冲区。 stderr没有理由迟于stdout

我尝试过:

import sys
sys.stdout.write("stdout1 ")
sys.stderr.write("stderr1 ")
sys.stdout.write("stdout2 ")
sys.stderr.write("stderr2 ")

运行python test.py

结果:

stderr1 stderr2 stdout1 stdout2

它按预期工作。


import sys
sys.stdout.write("stdout1 ")
sys.stderr.write("stderr1 ")
sys.stdout.write("stdout2 ")
sys.stderr.write("stderr2 ")

运行python -u test.py

结果:

stdout1 stderr1 stdout2 stderr2

它按预期工作。


import sys
sys.stdout.write("stdout1\n")
sys.stderr.write("stderr1\n")
sys.stdout.write("stdout2\n")
sys.stderr.write("stderr2\n")

运行python test.py

结果:

stdout1
stderr1
stdout2
stderr2

它按预期工作。


import sys
sys.stdout.write("stdout1 ")
sys.stderr.write("stderr1 ")
sys.stdout.write("stdout2 ")
sys.stderr.write("stderr2 ")

print()
string = ""
for i in range(10):
    string = string + str(i) + "\n"
print(string)

实际结果:

stdout1 stdout2
0
1
2
3
4
5
6
7
8
9

stderr1 stderr2

我认为应该是:

stderr1 stderr2 stdout1 stdout2
0
1
2
3
4
5
6
7
8
9

1 个答案:

答案 0 :(得分:1)

在Python3.x中,stderr是行缓冲区
在Python2.x中,stderr是无缓冲的

https://bugs.python.org/issue13597
https://docs.python.org/3/library/sys.html#sys.stderr