gpt4 book ai didi

python - 在 Python 中非阻塞地收集子进程输出

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:17 27 4
gpt4 key购买 nike

有没有一种简单的方法可以收集子进程的输出而无需实际等待它?

我可以考虑创建一个 subprocess.Popen() 并捕获其标准输出,然后调用 p.communicate(),但这会阻塞,直到子进程终止。

我可以考虑使用 subprocess.check_output() 或类似的,但这也会阻塞。

我需要一些可以启动的东西,然后做其他事情,然后检查子进程是否被终止,如果是,则获取其输出。

我可以想到两种相当复杂的方法来实现这一点:

  1. 将输出重定向到文件中,然后在终止后我可以从该文件读取输出。
  2. 实现并启动一个处理程序线程(!),该线程不断尝试从子进程的标准输出读取数据并将其添加到缓冲区。

第一个需要临时文件和磁盘 I/O,就我的情况而言,我并不喜欢这些。第二个意味着实现相当多的工作。

我想可能有一种我还没有想到的更简单的方法,或者在一些我还没有找到的库中有一个现成的解决方案。

最佳答案

在线程中调用 check_output 有什么问题吗?

import threading,subprocess

output = ""

def f():
global output
output = subprocess.check_output("ls") # ["cmd","/c","dir"] for windows


t = threading.Thread(target=f)
t.start()
print('Started')
t.join()
print(output)

请注意,人们可能会想使用p = subprocess.Popen(cmd,stdout=subprocess.PIPE),请等待p.poll()! = None 并尝试随后读取 p.stdout:这只在输出很小时才起作用,否则你会遇到死锁,因为 stdout 缓冲区是全文已满,您必须不时阅读。

使用p.stdout.readline()可以工作,但如果进程不定期打印也会阻塞。如果您的应用程序始终打印到输出,那么您可以将其视为非阻塞,并且解决方案是可以接受的。

关于python - 在 Python 中非阻塞地收集子进程输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44884278/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com