如何将Linux CPU、内存、磁盘查询命令嵌入Python subprocess获取输出
解决方案
方案1:直接通过shell=True执行完整命令(最简单,无转义烦恼)
你给出的是原生bash语法命令(含管道、反引号命令替换),直接开启shell=True参数即可让subprocess调用系统shell解析执行,不需要手动处理任何转义。注意用Python原始字符串r""包裹命令,避免Python自身把字符串里的反斜杠提前转义。
import subprocess # 用原始字符串包裹完整shell命令,可按需去掉外层echo cmd = r'''echo "CPU `LC_ALL=C top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}'`% RAM `free -m | awk '/Mem:/ { printf("%3.1f%%", $3/$2*100) }'` HDD `df -h /store | awk '/\// {print $(NF-1)}'`"''' # 执行命令捕获输出 result = subprocess.run(cmd, shell=True, capture_output=True, text=True) if result.returncode == 0: monitor_info = result.stdout.strip() print(monitor_info) else: print("命令执行错误:", result.stderr)
注意:shell=True仅适合执行固定的、无用户可控输入的命令,无注入风险,完全适配你的使用场景。
方案2:拆分命令链逐段调用(无需shell=True,更安全)
如果不想开启shell=True,可以把管道逻辑拆分,逐个调用每个命令,把前一个的输出作为后一个的输入,完全绕开shell转义问题。
import subprocess # 1. 计算CPU使用率 top_res = subprocess.run( ["top", "-bn1"], capture_output=True, text=True, env={"LC_ALL": "C"} # 环境变量单独传,不需要写在命令中 ).stdout grep_res = subprocess.run(["grep", "Cpu(s)"], input=top_res, capture_output=True, text=True).stdout sed_res = subprocess.run(["sed", r"s/.*, *\([0-9.]*\)%* id.*/\1/"], input=grep_res, capture_output=True, text=True).stdout cpu_usage = f"{100 - float(sed_res.strip()):.1f}%" # 2. 计算内存使用率 free_res = subprocess.run(["free", "-m"], capture_output=True, text=True).stdout mem_usage = subprocess.run(["awk", "/Mem:/ { printf(\"%3.1f%%\", $3/$2*100) }"], input=free_res, capture_output=True, text=True).stdout.strip() # 3. 计算磁盘使用率 df_res = subprocess.run(["df", "-h", "/store"], capture_output=True, text=True).stdout hdd_usage = subprocess.run(["awk", r"/\// {print $(NF-1)}"], input=df_res, capture_output=True, text=True).stdout.strip() # 拼接最终结果 monitor_info = f"CPU {cpu_usage} RAM {mem_usage} HDD {hdd_usage}" print(monitor_info)
可选优化方案(无需调用外部命令)
如果允许安装第三方库,用psutil直接读取系统指标,完全不用处理shell命令和转义,性能更好也更稳定:
import psutil # CPU使用率(1秒采样比top单次采样更准确) cpu_usage = f"{psutil.cpu_percent(interval=1)}%" # 内存使用率 mem = psutil.virtual_memory() mem_usage = f"{mem.percent:.1f}%" # /store分区磁盘使用率 hdd = psutil.disk_usage("/store") hdd_usage = f"{hdd.percent}%" monitor_info = f"CPU {cpu_usage} RAM {mem_usage} HDD {hdd_usage}" print(monitor_info)
内容的提问来源于stack exchange,提问作者snorlax
相关产品推荐
相关产品推荐

