如何在subprocess.check_output运行过程中同步执行其他任务?
解决方案
subprocess.check_output属于阻塞调用,执行后会一直等待子进程运行结束才会返回结果,因此你原有代码中的while循环无法在ping命令运行期间生效——等ping变量完成赋值时,ping命令已经执行完毕了。
你可以改用非阻塞的subprocess.Popen启动子进程,通过轮询子进程状态实现运行中提示,实现代码如下:
import subprocess import time # 用Popen启动子进程,不会阻塞主进程 p = subprocess.Popen("ping -n 10 www.google.com.", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) # 轮询子进程状态 while p.poll() is None: # poll返回None说明子进程仍在运行 print("ping is still running") time.sleep(1) # 控制打印频率,避免占用过多CPU # 子进程结束后获取执行输出 ping = p.communicate()[0] print(ping)
关键逻辑说明
Popen启动子进程后主程序会继续往下执行,不会等待子进程结束p.poll()用于获取子进程的退出状态,子进程运行中返回None,运行结束后返回退出码time.sleep(1)可根据需要调整,修改提示信息的打印间隔p.communicate()会读取子进程的所有输出内容,效果和你原代码中的check_output一致,如果需要判断命令是否执行成功,可以检查p.returncode的值,非0代表命令执行出错。
内容的提问来源于stack exchange,提问作者user11578023
相关产品推荐
相关产品推荐

