如何在Python脚本中捕获curl命令的JSON输出并存储为对象?
解决方法:捕获curl输出并转为Python对象
嘿,我来帮你搞定这个问题!你现在用subprocess.call()执行curl命令的话,只会拿到命令的退出状态码,输出直接打到终端了,脚本里根本抓不到。要把JSON输出存成Python对象,得换个方式捕获命令的输出,再解析成JSON格式就行。
方法一:使用subprocess.run()(Python 3.5+推荐)
这是Python官方推荐的新方法,功能更灵活,能同时捕获标准输出和错误输出:
import subprocess import json # 执行curl命令并捕获输出 result = subprocess.run( ['curl', '--digest', '--user', 'user:pass', 'https://url'], capture_output=True, # 捕获stdout和stderr text=True # 让输出以字符串形式返回,默认是字节流 ) # 先检查命令是否执行成功 if result.returncode == 0: # 将JSON字符串解析为Python字典/列表对象 json_data = json.loads(result.stdout) # 现在你就可以随意操作json_data这个对象了 print("解析后的JSON对象:", json_data) # 比如取某个字段:json_data["key"] else: # 如果命令执行失败,打印错误信息 print(f"curl命令执行失败,错误信息:{result.stderr}")
方法二:使用subprocess.check_output()
这个方法会直接返回命令的标准输出,如果命令执行失败(返回非0状态码),会抛出CalledProcessError异常:
import subprocess import json try: # 捕获curl的输出(字符串形式) output = subprocess.check_output( ['curl', '--digest', '--user', 'user:pass', 'https://url'], text=True ) # 解析为Python对象 json_data = json.loads(output) print("解析后的JSON对象:", json_data) except subprocess.CalledProcessError as e: print(f"curl命令执行出错:{e}") except json.JSONDecodeError as e: print(f"JSON格式解析失败:{e}")
关键说明
text=True(或者Python 3.7之前用universal_newlines=True):确保输出是字符串而不是字节流,这样json.loads()可以直接处理,不用手动解码。- 异常处理:一定要加上异常捕获,避免因为网络问题、认证失败、JSON格式错误导致脚本崩溃。
- 解析后的
json_data就是Python的字典或列表对象,你可以像操作普通Python数据结构一样使用它。
内容的提问来源于stack exchange,提问作者Srinivas Jayaram
相关产品推荐
相关产品推荐

