Python 3调用bash脚本时如何将输出存入变量?当前返回值为0的问题
问题核心
你当前调用的subprocess.call方法,返回值是被执行命令的退出状态码,而非命令的标准输出内容。
你在终端最先看到的那段JSON输出,是bash脚本的标准输出默认直接继承Python进程的输出流,无捕获直接打印到屏幕的结果;方法返回的0,仅代表bash脚本执行成功无报错,这就是为什么变量拿到的始终是0。调整完成后,脚本的输出不会再直接打印到终端,而是全部存入你定义的变量中,按你的代码逻辑输出。
代码调整方法
要把bash脚本的标准输出存入Python变量,需要更换为支持输出捕获的subprocess调用方式,推荐两种实现:
- 通用兼容写法(适配所有Python3版本)
用subprocess.check_output直接捕获命令输出:#!/usr/bin/env python3 import subprocess def api_call(): # 执行脚本,text=True直接返回字符串格式的输出,避免字节转义问题 script_output = subprocess.check_output( "/home/gposcl1/PyNetBox/api_GET.sh", shell=True, text=True ) # 去掉输出末尾多余的换行符,避免后续字符串处理出问题 return script_output.strip() api_call_result = api_call() # 保留原有代码的空行打印间隔逻辑 print("\n\n") print(api_call_result) - Python3.7及以上版本推荐写法
用官方推荐的subprocess.run方法,可同时捕获标准输出、错误输出,方便排查问题:#!/usr/bin/env python3 import subprocess def api_call(): exec_result = subprocess.run( "/home/gposcl1/PyNetBox/api_GET.sh", shell=True, capture_output=True, text=True ) # 主动判断脚本执行状态,失败时抛出可读的错误信息 if exec_result.returncode != 0: raise RuntimeError(f"API调用脚本执行失败,错误信息:{exec_result.stderr}") return exec_result.stdout.strip() api_call_result = api_call() print("\n\n") print(api_call_result)
注意:这里必须加
shell=True参数,否则subprocess会把完整的脚本路径字符串当成可执行文件名,无法正确解析执行bash脚本。
内容的提问来源于stack exchange,提问作者Sean Liles
相关产品推荐
相关产品推荐

