使用subprocess.call的Python执行顺序

时间:2017-03-07 09:52:06

标签: python subprocess

我在文件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

.
.
.

依旧......?

谢谢..

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)执行相同操作但使用自己的缓冲区。它首先终止,因此它的输出首先在文件中。

相关问题