如何在Python脚本中处理gcloud命令输出并筛选指定属性的VM实例
处理Python调用gcloud命令返回输出的方法
核心思路
你拿到的subprocess.CompletedProcess是subprocess执行完成后的返回对象,默认不会捕获命令的标准输出,需要先调整调用参数拿到输出内容,同时可以利用gcloud原生支持的结构化输出能力,避免手动解析纯文本的麻烦。
具体实现步骤
1. 调整subprocess调用参数,捕获输出
调用subprocess.run时添加以下参数:
capture_output=True:捕获命令的标准输出(stdout)和错误输出(stderr)text=True:将输出的字节流转为字符串(Python 3.7及以上支持,老版本可替换为universal_newlines=True)check=True:命令执行失败时直接抛出异常,方便问题排查
2. 利用gcloud的json输出格式,直接解析为结构化数据
gcloud支持通过--format=json参数直接返回JSON格式的结果,不需要手动解析表格文本,处理起来更稳定。
修改后的完整代码示例:
import subprocess import json # 设置目标项目 subprocess.run("gcloud config set project 你的项目ID", shell=True, check=True) # 调用gcloud查询实例列表,指定输出为json,捕获输出 result = subprocess.run( ["gcloud", "compute", "instances", "os-inventory", "list-instances", "--format=json"], capture_output=True, text=True, check=True ) # 将输出的JSON字符串转为Python列表,每个元素对应一个VM实例的属性字典 vm_list = json.loads(result.stdout)
如果不确定JSON返回的字段名,可以先打印vm_list[0]查看所有可用字段,再对应筛选即可。
3. 按需求筛选VM实例
拿到vm_list之后就可以直接按字段筛选,示例:
- 筛选名称为server00的实例:
target_vm = [vm for vm in vm_list if vm["name"] == "server00"]
- 筛选内网IP为10.x.x.x的实例:
target_vm = [vm for vm in vm_list if vm["internalIp"] == "10.x.x.x"]
- 筛选运行状态的实例:
running_vms = [vm for vm in vm_list if vm["status"] == "RUNNING"]
可选方案:手动解析原始表格输出
如果你不想用json格式,也可以手动解析原生的表格输出:
result = subprocess.run( ["gcloud", "compute", "instances", "os-inventory", "list-instances"], capture_output=True, text=True, check=True ) lines = result.stdout.strip().split("\n") # 第一行是表头,拆分后作为字段名 headers = [h.strip() for h in lines[0].split() if h.strip()] vm_list = [] for line in lines[1:]: values = [v.strip() for v in line.split() if v.strip()] # 表头和值拼成字典 vm_info = dict(zip(headers, values)) vm_list.append(vm_info) # 后续筛选逻辑和上面一致
注意:这种解析方式容易因为字段内容带空格、对齐格式变化出问题,优先推荐用JSON输出的方案。
内容的提问来源于stack exchange,提问作者tester81
相关产品推荐
相关产品推荐

