如何在Bash脚本中获取Python脚本返回的列表?
在Bash脚本中获取Python返回的列表的方法
先拆解你遇到的两个核心问题:
1. 终端里的[1,2,3]来自哪里?
Python的exit()函数只能接受0-255之间的整数作为退出状态码,当你传入列表ret时,Python无法将其转换为有效状态码,会自动把列表的字符串表示[1,2,3]打印到标准错误流(stderr)。而你用$(...)捕获的是标准输出(stdout),所以这部分内容直接显示在终端,没有被存入out变量。
另外你Bash脚本里的echo $(out)是错误语法,正确写法是echo "$out"或echo "${out[@]}",但因为原Python脚本根本没往stdout输出内容,所以out变量是空的,自然没有输出。
2. 正确获取Python返回列表的方法
想要在Bash中获取Python的列表,需要让Python将列表内容输出到标准输出(stdout),再由Bash捕获并处理,以下是两种常用方案:
方案一:输出空格分隔的元素(适合简单无特殊字符的列表)
修改Python脚本test_return_list.py:
ret = [1, 2, 3] # 将列表元素转为字符串后用空格拼接,输出到stdout print(' '.join(map(str, ret)))
修改Bash脚本test_python_return_list.sh:
#!/bin/bash echo "check return list from python" # 捕获Python输出,自动按空格分割为Bash数组 out=($(python3 ./test_return_list.py)) echo "return from python script: " # 打印整个数组 echo "${out[@]}" # 也可以单独访问数组元素,比如第一个元素:${out[0]}
方案二:用JSON格式输出(适合含特殊字符或复杂结构的列表)
如果列表元素包含空格、引号等特殊字符,用JSON格式更稳妥,需要确保Bash环境安装了jq工具(多数Linux发行版可通过包管理器安装)。
修改Python脚本:
import json ret = [1, 2, 3, "hello world"] # 将列表转为JSON字符串输出 print(json.dumps(ret))
修改Bash脚本:
#!/bin/bash echo "check return list from python" # 捕获JSON格式的输出 json_out=$(python3 ./test_return_list.py) # 用jq解析JSON,提取所有元素并转为Bash数组 out=($(echo "$json_out" | jq -r '.[]')) echo "return from python script: " echo "${out[@]}"
内容的提问来源于stack exchange,提问作者issac
相关产品推荐
相关产品推荐

