Python防止stdout.readline()冻结程序的方法有哪些?
2021-07-26 15:42:00
浏览数 (4367)
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'