【发布时间】:2021-02-18 18:19:44
【问题描述】:
实时获取子流程的结果
我想在子进程终止之前实时获取每个结果 (sys.stdout)。
假设我们有以下 file.py。
import time,sys
sys.stdout.write('something')
while True:
sys.stdout.write('something else')
time.sleep(4)
好吧,我对子进程、异步和线程模块进行了一些尝试,尽管所有方法在进程完成时都会给我结果。理想情况下,我想自己终止进程并实时获取每个结果(stdout、stderr),而不是在进程完成时。
import subprocess
proc = sp.Popen([sys.executable, "/Users/../../file.py"], stdout = subprocess.PIPE, stderr= subproces.STDOUT)
proc.communicate() #This one received the result after finish
我也尝试使用 threading 模块和 asyncio 在另一个线程中使用 readline proc.stdout.readline(),但它也会等待进程完成。
我发现唯一有用的是psutil.Popen(*args, **kwargs) 的使用,我可以随时终止该进程并获取一些统计信息。但主要问题仍然是在每次打印时实时(异步)获取 file.py 的每个 sys.stdout 或 print。
*python3.6的首选解决方案
【问题讨论】:
-
你有没有试过在`sys.stdout.write()`之后调用
sys.stdout.flush()。您可能还需要在传递给后者的字符串末尾添加换行符。 -
Thanx4respose。我已经尝试过了,但没有结果。试想一下,即使是第一个
sys.stdout这也无法读取它并等到终止。 -
对于(近乎)实时的进程间通信,您可能需要使用
multiprocessing.Manager。另一种可能性是mmap。 -
我更喜欢在不使用网络的情况下这样做。我有多种通过网络协议的选择,例如twisted、zmq等。核心是捕获
sys.stdout每次被其他进程使用。 -
我的建议都不需要使用网络——它们提供了在同一台计算机上运行的进程之间进行通信的方法。刚想到第三个:
multiprocessing.shared_memory.
标签: python multithreading subprocess python-asyncio real-time