【发布时间】:2011-07-26 14:08:26
【问题描述】:
我想读取子进程的标准输出的第一个字节,以了解它已经开始运行。之后我想丢弃所有进一步的输出,这样我就不必担心缓冲区了。
最好的方法是什么?
澄清:我希望子进程继续与我的程序一起运行,我不想等待它终止或类似的事情。理想情况下,有一些简单的方法可以做到这一点,而无需诉诸 threading、forking 或 multiprocessing。
如果我忽略输出流,或.close() 它,如果发送的数据多于缓冲区容纳不下的数据,则会导致错误。
【问题讨论】:
-
我的回答不正是你想要的吗?启动子进程,读取第一个字节,然后继续并行运行进程...
-
据我所知,它会继续将
stdout和stderr读入缓冲区,浪费内存。我不确定,但是如果缓冲区填满,这也可能导致子进程阻塞。我想避免这种情况。 -
他的解决方案不会阻塞,因为它从不读取超过第一个字节的任何内容。但你不知道它什么时候完成。
wait不会读取任何内容,但可能会阻塞(如果程序写入过多并开始等待操作系统读取管道)。我的communicate不会,它会读取内容,占用内存。但是您不阅读就无法知道该过程何时结束...让我提供另一种解决方案 -
@Jeremy 我修改了我的示例以证明没有浪费任何内存。使用进程监视器运行并观察进程的内存使用情况。它永远不会上升。
-
我已经测试过了,第二个进程阻塞了一次,第一个进程中的
stdout缓冲区已满。
标签: python stream subprocess