首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >subprocess.communicate只在出口读取

subprocess.communicate只在出口读取
EN

Stack Overflow用户
提问于 2019-04-02 00:56:06
回答 1查看 192关注 0票数 2

我试图在一个线程中运行一个子进程,该进程将定期输出数据(但通常是每秒输出一次以上)。

然而,当试图读取进程的stdout时,communicate(timeout=2)总是遇到一个TimeoutError,即使当有效的stdout数据是可用的时候也是如此。

代码运行在一个烧瓶应用程序中,在一个由daemon=True生成的线程中。

我试图运行的过程是

代码语言:javascript
复制
print("A")
time.sleep(1)
print("B")
time.sleep(5)
print("C")
exit()

这应该是给我两个"A“和"B”而不打超时。

这是应该为我提供输出的循环:

代码语言:javascript
复制
with Popen(
        args=[get_python_path(), path.join(
            self.path, "output.py")],
        stdout=PIPE, stderr=PIPE, universal_newlines=True) as proc:
    self.status = RNNTrainer.STARTED
    status = None
    while status == None:
        try:
            stdout, stderr = proc.communicate(timeout=2)
            print(stdout)
            status = proc.returncode
        except TimeoutExpired as err:
            print("Timeout Expired")
            proc.poll()
            status == proc.returncode
        except Exception as err:
            print("Unhandled Ex")

我希望看到的输出如下:

代码语言:javascript
复制
A
B
Timeout expired <-This after the sleep(5) call
C

然而,我却得到了

代码语言:javascript
复制
Timeout expired
Timeout expired
Timeout expired
A
B
C

换句话说。只有当程序终止时,.communicate才能工作。否则它就结束了

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-02 01:17:33

flush=True添加到print()调用

代码语言:javascript
复制
print("A", flush=True)
time.sleep(1)
print("B", flush=True)
time.sleep(5)
print("C", flush=True)
exit()

这迫使print()刷新流。

当交互时,stdout和stderr流是行缓冲的.否则,它们就像普通的文本文件一样被块缓冲.可以使用-u命令行选项重写此值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55465500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档