我有一个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时,它的输出是行缓冲的。 当输出是常规文件时,输出是块缓冲。