我在文件abc.py中有以下代码:
import subprocess
def evaluate():
for i in range(5):
print("Printing", i)
subprocess.call(['ls', '-lrt'])
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
evaluate()
现在当我使用python abc.py>进行调用时out.dat,输出文件包含'ls -lrt'的结果五次,然后在代码中打印语句。 为什么会这样发生?如果需要输出为什么我应该怎么做:
printing 0
(results of ls -lrt here)
~~~~~~~~~~~~~~~~~~~~~~~
printing 1
.
.
.
依旧......?
谢谢..
答案 0 :(得分:2)
您需要在调用子流程之前刷新流:
import subprocess, sys
def evaluate():
for i in range(5):
print("Printing", i)
sys.stdout.flush()
subprocess.call(['ls', '-lrt'])
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
evaluate()
只要您写入终端(无重定向),刷新就会自动逐行放置。然后你没有注意到这个问题,因为print()
在换行符处刷新。
只要将输出重定向到文件,print()
语句就会注意到这一点,并且只有在某个缓冲区已满(并且在终止时间)时才会自动刷新。
子进程(ls
)执行相同操作但使用自己的缓冲区。它首先终止,因此它的输出首先在文件中。