如何在Python中解析ps命令输出的多行字符串?
解析ps命令输出的Python实现
场景说明
你需要执行命令ps -T --pid <pid> -o comm,class,pri,当前通过subprocess模块实现了命令调用,现在需要解析命令输出,将每行的COMMAND、CLS、PRI字段分别存入单独变量。
优化命令调用(避免安全风险)
首先优化原有的subprocess调用方式,避免使用shell=True(存在命令注入风险),改用列表形式传递命令参数:
import subprocess pid = "替换为目标PID" # 用列表传递命令及参数,更安全 cmd = ["ps", "-T", "--pid", pid, "-o", "comm,class,pri"] proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = proc.communicate() output_str = out.decode('latin-1')
解析输出内容
命令输出是空格分隔的结构化文本,可按以下步骤解析:
- 分割输出为行,过滤空行
- 跳过表头行,逐行处理数据
- 按空格分割每行字段,存入单独变量
基础解析示例
# 分割输出为行,过滤空行和空白内容 lines = [line.strip() for line in output_str.split('\n') if line.strip()] # 跳过第一行表头,遍历数据行 for line in lines[1:]: # 按任意数量空格分割字段,分别存入变量 comm, cls, pri = line.split() # 此处可按需使用变量,比如打印或存储 print(f"命令名: {comm}, 调度类: {cls}, 优先级: {pri}")
批量存储结果
如果需要将所有进程信息统一存储,可使用列表+字典的形式:
process_list = [] for line in lines[1:]: comm, cls, pri = line.split() # 将字段存入字典,再添加到列表 process_list.append({ "command": comm, "sched_class": cls, "priority": pri }) # 后续可遍历process_list获取所有进程信息 for proc in process_list: print(f"进程命令: {proc['command']}, 调度类: {proc['sched_class']}, 优先级: {proc['priority']}")
处理特殊情况(如命令名含空格)
如果COMMAND字段存在空格(ps默认截断短命令名,长命令可能显示为带空格的形式),可使用正则分割,限制分割次数:
import re for line in lines[1:]: # 最多分割2次,确保第一个字段完整获取命令名 comm, cls, pri = re.split(r'\s+', line, maxsplit=2) print(f"命令名: {comm}, 调度类: {cls}, 优先级: {pri}")
内容的提问来源于stack exchange,提问作者user5759780
相关产品推荐
相关产品推荐

