Python脚本在打印之前打印os.system的输出

我有一个python脚本test.py:

print "first" import os os.system("echo second") 

在Linux命令行我执行

 python test.py 

它返回:

 first second 

然后我执行

 python test.py > test.out; cat test.out 

哪个返回

 second first 

如何redirect输出使得os.system调用在打印语句之前打印?

当你输出到管道时,Python缓冲你的输出写入到sys.stdout ,并在flush之后或溢出之后,或者在关闭之后(程序退出时)输出。 虽然它会缓冲打印调用,系统调用直接输出到标准输出,它们的输出不会被缓冲。 这就是为什么你看到这样的优先顺序。 为了避免这种情况,请使用python -u

 python -u test.py > test.out; cat test.out 

在这里看到更多信息。

编辑 :解释什么时候缓冲区将被刷新。

另一种防止os缓冲的方法是在第一次打印之后刷新输出:

 #!/usr/bin/env python import sys print "first" sys.stdout.flush() import os os.system("echo second") 

当python脚本的输出是一个tty时,它的输出是行缓冲的。 当输出是常规文件时,输出是块缓冲。