You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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')

解析输出内容

命令输出是空格分隔的结构化文本,可按以下步骤解析:

  1. 分割输出为行,过滤空行
  2. 跳过表头行,逐行处理数据
  3. 按空格分割每行字段,存入单独变量

基础解析示例

# 分割输出为行,过滤空行和空白内容
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 09:52:26