Python:如何在每次输出时获得子进程的输出而不是终止输出?

时间:2016-09-25 13:33:53

标签: python multithreading subprocess python-multithreading

我有两个脚本。 (代码如下)。第一个脚本只是延迟打印数字。

第二个脚本应该作为子进程启动第一个脚本,然后检查后台(!)是否第一个脚本输出一个数字,然后打印出来。

但我得到的是第二个脚本在第一个脚本终止时(20秒后)立即打印所有数字而不是每个时刻都有一个数字。 输出如下:

START
0
1
2
3
4
5
6
7
8
9
16:05:51
OVER

但我期望的是:

START
0
16:05:51
1
16:05:53
2
16:05:55
3
16:05:57
4
16:05:59
5
16:06:01
6
16:06:03
7
16:06:05
8
16:06:07
9
16:06:09
OVER

我该如何解决这个问题?

代码:

1.py:

import time
for i in range(10):
    print(i)
    sys.stdout.flush()
    time.sleep(2)

test.py:

from subprocess import Popen, PIPE, STDOUT
from time import strftime
import threading, sys

stream = Popen(['python', '1.py'], stdout=PIPE, stderr=STDOUT)
def a():
        while True:
            try:
                out = stream.communicate()[0].decode("utf-8")
                print(out, strftime("%H:%M:%S"))
                sys.stdout.flush()
            except ValueError:
                print('OVER')
                break
            except:
                raise
t = threading.Thread(target=a,)
t.start()
print('START')

1 个答案:

答案 0 :(得分:0)

尝试拨打

sys.stdout.flush()

每次打印后!

你基本上是在写一个缓冲区,那些写不会变成"刷新"直到编写过程完成!所以,如果你不想等到python解释器(或者下面的操作系统)决定"那么是时候冲洗了#34; ......你必须手动执行该步骤"!

有关更多背景信息,请参阅其他answer

编辑:因为这不适用于 stream ,如你所说:可能你必须其他方式来调用第二个脚本。您可以尝试使用pexpect模块。那一个存在于" sole" "互动"的目的用stdout输出!