本文主要是介绍Python子进程执行系统命令,并实时获取输出数据和返回结果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
背景
最近在用Python写一个小程序,需要调用系统命令,需要获取执行之后的返回结果。由于任务执行时间较长,为便于观测任务执行过程,需要实时打印执行过程中产生的数据。经过一番摸索,封装了个通用的工具包。
代码
easy_subprocess.py
"""
author: lixk
description: 本工具包用于执行子进程,实时获取子进程执行过程中输出的数据并打印到控制台,然后返回状态码和执行结果
"""
import subprocess
import sysdef run(cmd, shell=False) -> (int, str):"""开启子进程,执行对应指令,控制台打印执行过程,然后返回子进程执行的状态码和执行返回的数据:param cmd: 子进程命令:param shell: 是否开启shell:return: 子进程状态码和执行结果"""print('\033[1;32m************** START **************\033[0m')p = subprocess.Popen(cmd, shell=shell, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)result = []while p.poll() is None:line = p.stdout.readline().strip()if line:line = _decode_data(line)result.append(line)print('\033[1;35m{0}\033[0m'.format(line))# 清空缓存sys.stdout.flush()sys.stderr.flush()# 判断返回码状态if p.returncode == 0:print('\033[1;32m************** SUCCESS **************\033[0m')else:print('\033[1;31m************** FAILED **************\033[0m')return p.returncode, '\r\n'.join(result)def _decode_data(byte_data: bytes):"""解码数据:param byte_data: 待解码数据:return: 解码字符串"""try:return byte_data.decode('UTF-8')except UnicodeDecodeError:return byte_data.decode('GB18030')if __name__ == '__main__':return_code, data = run('ping www.baidu.com')print('return code:', return_code, 'data:', data)
需要用到子进程功能的时候,直接导入该文件,调用run(...)
方法即可。
示例
这篇关于Python子进程执行系统命令,并实时获取输出数据和返回结果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!