如何从Bash脚本中获取Python脚本的函数返回值?
获取Python脚本返回值到Bash的几种方法
你遇到的问题很典型:Python函数的return值不会自动被Bash捕获——那只是Python内部函数的返回值,和脚本进程的输出/退出码没有直接关系。下面给你几种可行的实现方案,按需选择:
方案1:分离日志与结果输出(推荐)
把普通日志打到标准错误流(stderr),把需要返回的结果打到标准输出流(stdout),这样Bash可以单独捕获stdout作为结果,stderr的日志会正常输出到终端(或者可以重定向到文件)。
修改foo.py:
import sys def main(): # 日志输出到stderr,不会被Bash的$(...)捕获 print("exec main..", file=sys.stderr) return "execution ok" if __name__ == '__main__': result = main() # 结果输出到stdout,会被Bash捕获 print(result)
对应的start.sh:
# 仅捕获stdout到script_output,stderr日志会直接显示在终端 script_output=$(python foo.py) echo "捕获到的返回值:$script_output" # 如果需要把stderr日志保存到文件,可以这样写 # script_output=$(python foo.py 2>foo.log)
方案2:用特殊标记过滤结果
如果不想修改日志的输出流,可以给返回值加一个唯一的标记,然后在Bash中过滤提取。
修改foo.py:
def main(): print("exec main..") return "execution ok" if __name__ == '__main__': result = main() # 用唯一标记包裹结果,方便后续过滤 print(f"===PYTHON_RESULT==={result}")
对应的start.sh:
# 捕获所有输出 full_output=$(python foo.py 2>&1) # 提取标记后的结果 script_output=$(echo "$full_output" | grep -o "===PYTHON_RESULT===".* | sed 's/===PYTHON_RESULT===//') # 打印原始日志(去掉结果行) echo "原始日志:" echo "$full_output" | grep -v "===PYTHON_RESULT===" # 打印提取到的返回值 echo "捕获到的返回值:$script_output"
方案3:用临时文件传递结果
让Python把返回值写入一个临时文件,Bash从文件中读取内容。
修改foo.py:
def main(): print("exec main..") return "execution ok" if __name__ == '__main__': result = main() # 写入临时文件 with open("/tmp/python_script_result.tmp", "w") as f: f.write(result)
对应的start.sh:
# 执行Python脚本,打印所有输出 python foo.py 2>&1 # 从临时文件读取结果 script_output=$(cat /tmp/python_script_result.tmp) echo "捕获到的返回值:$script_output" # 用完删除临时文件 rm /tmp/python_script_result.tmp
方案4:用退出码传递整数结果
如果你的返回值是整数(比如表示成功/失败的状态码),可以用sys.exit()把函数返回值设置为进程的退出码,Bash用$?获取。
修改foo.py:
import sys def main(): print("exec main..") return 0 # 0表示成功,非0表示错误 if __name__ == '__main__': exit_code = main() sys.exit(exit_code)
对应的start.sh:
python foo.py 2>&1 # 获取退出码 script_exit_code=$? echo "Python脚本的退出码:$script_exit_code"
内容的提问来源于stack exchange,提问作者AlessioG
相关产品推荐
相关产品推荐

