首页 > 解决方案 > 捕获和处理流程的输出

问题描述

我想在python中制作包装器,它将捕获另一个python程序的输出,然后将该输出发送到多个地方,如记录器和telnet服务器,但我被困在产生这些进程和它的通信
我已经尝试使用子进程来运行和捕获但是我遇到了问题,它仅在进程退出时才返回输出,这对于大多数程序处于基本状态的无限循环来说是不可接受的,因此例如我有这两个脚本

i = 0
running = True
while running:
    print(i)
    sleep(10) #simulate program idling
    if i == 20:
        running = False
    else:
        i += 1

print("Exit reached")

第二个应该是这样的

program = "first_script.py"
program.start() #non blocking?

while program.exist:
    print(program.get_output())
    sleep(5)

所以因为它会每 5 秒请求一次输出,所以它应该得到 2 倍的相同输出,但我不确定是否应该考虑获取一些事件监听函数,它将下一行添加到缓冲区或类似上面的示例每次从某个内部缓冲区询问整个输出时都应该收到
我的问题是在捕获此输出并将其发送到另一个进程时我应该使用什么方法以及如何使用

标签: pythonmultiprocessing

解决方案


你可以这样做,它subprocess在我的测试中使用并且至少可以在 Windows 上运行(我认为它也可以在其他操作系统上运行):

import subprocess
import sys

# Execute another Python scipt as a separate process and echo its output.
kwargs = dict(stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
              universal_newlines=True)
args = [sys.executable, 'second_script.py']
with subprocess.Popen(args, **kwargs).stdout as output:
    for line in output:
        print(line, end='')  # Process the output...

推荐阅读