码迷,mamicode.com
首页 > 编程语言 > 详细

python print end 堵塞问题以及如何非堵塞读取subprocess的所有输出做到实时读取

时间:2021-05-24 08:56:33      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:cep   shel   tput   utf8   效果   div   fcntl   block   style   

python print end

如下代码:

    for i in range(5):
        time.sleep(1)
        print(i, end=‘‘)

本来想要的效果是每秒输出,但是发现这样写会等所有循环完毕后才会打印,发现需要使用flush参数来立即输出,正确代码如下:

    for i in range(5):
        time.sleep(1)
        print(i, end=‘‘, flush=True)

实时读取subprocess的输出

如何实时读取subprocess的输出是一个困扰我很久的问题,最近终于得到了解决,之前是使用subprocess的readline(),但是如果那一行仍未运行完时还是会堵塞,无法做到真正的实时读取,多方调查发现配合fcntl库可以做到,方法如下:

p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

def non_block_read(output):  # 避免阻塞
    fd = output.fileno()
    fl = fcntl.fcntl(fd, fcntl.F_GETFL)
    fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
    try:
        return output.read()
    except:
        return ""

out = non_block_read(p.stdout)

if out != None:
    outstr = out.decode(utf8)
    print(outstr, end=‘‘, flush=True)

 

python print end 堵塞问题以及如何非堵塞读取subprocess的所有输出做到实时读取

标签:cep   shel   tput   utf8   效果   div   fcntl   block   style   

原文地址:https://www.cnblogs.com/CYHISTW/p/14767863.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!