如何用Python执行Shell命令并保存输出到变量以解析结构化数据
Python执行终端命令并解析JSON输出的通用流程
通用处理步骤
配置subprocess参数捕获输出
默认subprocess.run()仅返回命令返回码,要捕获输出需指定stdout=subprocess.PIPE;若需处理错误输出,可追加stderr=subprocess.PIPE;同时指定encoding='utf-8',直接得到字符串而非字节串,避免额外的解码操作。执行命令并提取输出
调用subprocess.run()后,通过返回对象的.stdout属性获取命令的标准输出内容;若命令执行失败,可通过.stderr查看错误信息。解析JSON为Python字典
使用json.loads()将捕获到的JSON格式字符串转换为Python字典,这样就能像操作普通字典一样提取字段。提取目标字段
从解析后的字典中,直接通过键名(如region、city)取出对应值;推荐用.get()方法,避免键不存在时抛出异常。
代码示例
以调用curl ipinfo.io获取IP地理信息为例:
import subprocess import json # 执行curl命令,捕获输出 result = subprocess.run( ['curl', 'ipinfo.io'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding='utf-8' ) # 处理命令执行结果 if result.returncode == 0: try: # 解析JSON输出为字典 output_dict = json.loads(result.stdout) # 提取目标字段 region = output_dict.get('region') city = output_dict.get('city') print(f"地区: {region}, 城市: {city}") except json.JSONDecodeError as e: print(f"JSON解析失败: {str(e)}") else: print(f"命令执行失败,错误信息: {result.stderr}")
关键注意事项
- 若curl命令需要额外参数(如请求头、POST数据),直接将参数按顺序放入列表,比如
['curl', '-H', 'Content-Type: application/json', '-d', '{"key":"val"}', 'https://example.com']。 - 尽量避免使用
shell=True,防止命令注入风险;如果必须依赖shell执行(比如需要管道、通配符),务必确保输入内容是完全可信的。
内容的提问来源于stack exchange,提问作者user3656142
相关产品推荐
相关产品推荐

