小白教程

 找回密码
 立即注册
查看: 9062|回复: 2

subprocess.Popen()是否导致主例程暂停stdout?

[复制链接]

1

主题

3

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2021-5-21 03:39:48 | 显示全部楼层 |阅读模式
这是我想做的事情:
在nix终端仿真器中,运行我的脚本。
调用subprocess.Popen()来生成许多进程,确保标准输出打印输出不会填满我的屏幕。
生成所有子进程后,我每秒都会对其进行轮询以收集返回码。收集完所有返回码后,我将继续打印摘要,以表明主要过程成功/失败的过程。每秒,我在屏幕上打印出一个进度点,以便在打印摘要之前,我知道主要进程正在运行。
我做了什么:
我在IDLE中开发了脚本,然后在IDLE中运行。在IDLE中,stdout没有发送到IDLE的Python shell,因此一切都按预期进行,在Raspberry pi上。
发生了什么:
一旦我开始在终端仿真器中运行相同的脚本,打印输出就会开始淹没我的终端。因此,我添加了stdout = subprocess.DEVNULL,从而抑制了打印输出。但是,同时,我的主要流程进度条的标准输出打印被暂停,直到所有流程结束并且所有进度点和摘要被立即打印出来。
我想知道如何在主流程中保持打印进度点而不被阻塞。
以下功能具有我描述的所有内容。第一个for循环产生所有子进程。然后,随后的while循环将继续轮询子进程并打印出进度点。
  1. '''Flash all firmware partitions for a new system'''
  2. def flash_all(paras,flash_all_commands):
  3.     processes=[]
  4.     paras['return_code']=list(paras['name'])
  5.     for Flash_ESP32_command in flash_all_commands:
  6.         # print(Flash_ESP32_command)
  7.         processes.append(subprocess.Popen(shlex.split(Flash_ESP32_command),stdout=subprocess.DEVNULL))
  8.     while(True):
  9.         i=0
  10.         done=True
  11.         for process in processes:
  12.             return_code=process.poll()
  13.             if return_code is None:
  14.                 done=False
  15.                 print('.',end='')
  16.                 break
  17.                 print("\n%s has not completed" %(paras['name'][i]))
  18.             else :
  19.                 paras['return_code'][i]=return_code
  20.             i=i+1
  21.         if done: break
  22.         time.sleep(1)
  23.     i=0
  24.     print()
  25.     for jig_id in paras['id']:
  26.         print("%s\t: %s" %(jig_id,'Success' if paras['return_code'][i]==0 else 'Failure'))
  27.         i=i+1
复制代码


回复

使用道具 举报

0

主题

2

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2021-5-22 23:14:30 | 显示全部楼层
我猜缓冲区在for循环的末尾被刷新。
您可以使用打印功能强制执行冲洗。
回复

使用道具 举报

0

主题

3

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2021-5-31 04:49:45 | 显示全部楼层
我认为在打印换行符时会刷新sys.stdout,因此会print('.')刷新stdout,但不会print('.', end='')
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|小白教程 ( 粤ICP备20019910号 )

GMT+8, 2024-9-20 12:34 , Processed in 0.027420 second(s), 26 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表