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

标签 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)

测试.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')

最佳答案

试着打电话

sys.stdout.flush()

在每次打印输出之后!

您基本上是在写入一个缓冲区,并且在写入进程完成之前,这些写入不会被“刷新”!所以,如果你不想等到 python 解释器(或下面的操作系统)决定“是时候刷新”......你必须“手动”执行该步骤!

查看其他answer了解更多背景信息!

编辑:正如您所说,这不适用于stream:可能您必须使用其他方法来调用第二个脚本。您可以尝试使用 pexpect模块代替。它的存在是为了与 stdout 输出“交互”的“唯一”目的!

关于Python:如何在每次输出而不是终止时获取子进程的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39687385/

相关文章:

python - 如何将多个进程的输出连接到另一个进程的输入?

python - 解决列表中也被分组的项目

multithreading - 有没有办法让 visual studio 中的多线程调试像 eclipse 一样工作?

ios - 如果通过 performSelectorInBackground 控制 UI 会发生什么?

c# - C#中自制线程池的多线程死锁

python - 从 Python 子进程执行 shell 脚本

python - Numpy 中浮点值的组件明智比较返回错误结果

python - 无法使用 python 将参数传递给 perl 脚本

python - 让python脚本在unix的后台运行

python - 回溯(最近一次调用): File "<stdin>", 第 1 行,在 <module> 中 TypeError: object() 不带任何参数