Linux下Python脚本捕获sar命令输出到变量报错求助
解决方案:在Python中捕获sar命令输出并赋值给变量
我明白你遇到的问题了——用os.system根本拿不到命令输出,os.popen虽然能拿到,但可能处理方式不对导致没法正确拆分到变量里。咱们换用Python标准库的subprocess模块来解决,这是现在Python处理外部命令的推荐方式,比os模块的那些方法更可靠。
完整代码示例
import subprocess try: # 执行sar命令并捕获输出,用shell=True解析管道和awk脚本 result = subprocess.run( "sar -u 1 1 | awk 'NR==4 {print $4, $5, $6, $7, $8, $9}'", shell=True, capture_output=True, text=True, check=True ) # 处理输出:去除空白字符,按空格分割为字段列表 output_fields = result.stdout.strip().split() # 验证字段数量后赋值给变量 if len(output_fields) == 6: c1, c2, c3, c4, c5, c6 = output_fields print(f"捕获到的变量:c1={c1}, c2={c2}, c3={c3}, c4={c4}, c5={c5}, c6={c6}") else: print(f"警告:命令输出字段数量不符,实际得到{len(output_fields)}个字段") print(f"原始输出内容:{result.stdout}") except subprocess.CalledProcessError as e: print(f"命令执行失败,错误信息:{e.stderr}") except Exception as e: print(f"发生未知错误:{str(e)}")
关键细节解释
subprocess.run()参数说明:
shell=True:因为你的命令包含管道|和awk脚本,需要让系统shell来解析执行;如果是简单无管道的命令,更推荐不用shell以避免注入风险。capture_output=True:同时捕获命令的标准输出和错误输出。text=True:直接返回字符串格式的输出,省去手动解码字节流的步骤。check=True:如果命令执行返回非0退出码,自动抛出异常,方便我们捕获执行失败的情况。
输出处理逻辑:
strip():清除输出前后的换行、空格等无用空白字符。split():默认按任意空白字符(空格、制表符等)分割,正好匹配awk输出的6个字段。- 增加字段数量检查是为了兼容不同Linux发行版的sar输出格式差异——有些系统的sar开头注释行数量不同,可能需要调整awk中的
NR==4行号。
更安全的无shell写法(可选)
如果担心shell注入风险,你可以把管道拆分为两个独立的子进程执行,不用依赖shell解析:
import subprocess try: # 先执行sar命令获取输出 sar_result = subprocess.run( ["sar", "-u", "1", "1"], capture_output=True, text=True, check=True ) # 将sar的输出作为awk的输入 awk_result = subprocess.run( ["awk", "NR==4 {print $4, $5, $6, $7, $8, $9}"], input=sar_result.stdout, capture_output=True, text=True, check=True ) # 后续处理和之前一致 output_fields = awk_result.stdout.strip().split() if len(output_fields) == 6: c1, c2, c3, c4, c5, c6 = output_fields print(f"捕获到的变量:c1={c1}, c2={c2}, c3={c3}, c4={c4}, c5={c5}, c6={c6}") else: print(f"警告:命令输出字段数量不符,实际得到{len(output_fields)}个字段") except subprocess.CalledProcessError as e: print(f"命令执行失败,错误信息:{e.stderr}")
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

