Python防止stdout.readline()冻结程序的方法有哪些?

猿友 2021-07-26 15:42:00 浏览数 (2379)
反馈

Python防止stdout.readline()冻结程序的方法有哪些?在我当前的程序中,我使用子处理程序启动服务器。​Popen()​ 和继续阅读从粗壮使用 ​readline()​。但是,当它卡在读线上,直到出现新行。这是不好的,因为我需要能够执行其他代码,而等待服务器输出。有什么办法可以阻止这种情况发生吗?

import subprocess

server = subprocess.Popen("startup command", stdout= subprocess.PIPE, encoding= "utf-8")

while True:
    out = server.stdout.readline()
    if out != "":
        print(out)
    print("checked for line")

我宁愿避免多线程,因为我的代码的不同部分将不再是线程安全。

解决方法:

使用​poll()​和​communicate()​代替:

import subprocess
import time

with subprocess.Popen(['bash', '-c', 'sleep 1 && echo OK'], stdout=subprocess.PIPE) as proc:
    while proc.poll() is None:
        print('<doing something useful>')
        time.sleep(0.3)
    out, err = proc.communicate()
    print(out)
<doing something useful>
<doing something useful>
<doing something useful>
<doing something useful>
b'OK\n'


0 人点赞