从Bash脚本调用Python脚本并获取返回值的问题
我有一个执行部分任务的Bash脚本,但需要处理从配置中获取的字符串(为简化测试已硬编码)。该字符串处理在Python中易实现,但在Bash中较复杂,因此我编写了一个Python脚本完成此任务,期望返回字符串(或理想情况下返回字符串数组)。
我在Bash脚本中调用该Python脚本,两个脚本位于同一目录且该目录已加入环境变量,测试环境为Ubuntu 22.04。
我的Python脚本如下:
#!/usr/bin/python def Get(input: str) -> list: #执行任务 - arr为输出数组 return ' '.join(arr) #或理想情况下返回arr
用于调用上述Python脚本的Bash脚本如下:
#!/bin/bash ARR=("$(python -c "from test import Get; Get('val1, val2,val3')")") echo $ARR for ELEMENT in "${ARR[@]}"; do echo "$ELEMENT" done
当我在Python脚本中添加print语句测试时能得到正确结果,说明Python脚本功能正常,但Bash脚本仅输出空行。我也曾尝试类似ARR=("$(python -c "from test import Get; RES=Get('val1, val2,val3')")")的写法并遍历RES,结果相同。
似乎Bash脚本无法处理Python返回的数据,请问如何修改这两个脚本以在Bash中正确获取Python脚本的返回值?能否获取完整数组,还是仅能获取字符串?
Bash只能捕获Python脚本**输出到标准输出(stdout)**的内容,直接return函数值不会被Bash接收到——这就是你看到空行的原因。下面分两种场景给出修改方案:
场景1:返回字符串并转为Bash数组
修改Python脚本
需要把处理后的结果打印到标准输出,而不是仅return,同时为避免元素含空格时的歧义,优先用换行分隔元素:
#!/usr/bin/python def Get(input_str: str) -> list: # 模拟任务处理:分割输入字符串得到数组 arr = [item.strip() for item in input_str.split(',')] # 将数组转为换行分隔的字符串输出 print('\n'.join(arr)) # 触发函数执行,从命令行接收输入参数 if __name__ == "__main__": import sys if len(sys.argv) > 1: Get(sys.argv[1])
修改Bash脚本
读取Python的输出,按换行分割为Bash数组:
#!/bin/bash # 按换行符读取Python输出,存入数组 IFS=$'\n' read -r -d '' -a ARR < <(python test.py 'val1, val2,val3') # 验证数组内容 echo "数组元素数量:${#ARR[@]}" for ELEMENT in "${ARR[@]}"; do echo "元素:$ELEMENT" done
场景2:直接返回兼容Bash的数组格式
如果希望Python直接输出能被Bash解析的数组定义,可以让Python生成Bash语法的数组字符串:
修改Python脚本
#!/usr/bin/python def Get(input_str: str) -> list: arr = [item.strip() for item in input_str.split(',')] # 生成Bash数组格式的字符串,如:("val1" "val2" "val3") bash_arr = '("' '" "'.join(arr) + '")' print(bash_arr) if __name__ == "__main__": import sys if len(sys.argv) > 1: Get(sys.argv[1])
修改Bash脚本
通过eval解析Python输出的数组定义:
#!/bin/bash # 执行Python脚本并解析输出为Bash数组 eval ARR=$(python test.py 'val1, val2,val3') # 验证数组 for ELEMENT in "${ARR[@]}"; do echo "元素:$ELEMENT" done
关键说明
- Bash与Python的进程间通信只能通过标准输出传递数据,Python函数的return值不会被外部进程捕获。
- 如果元素包含空格或特殊字符,优先用换行分隔的方式传递,避免空格作为分隔符导致元素拆分错误。
- 使用
eval时要确保Python输出的内容安全,避免注入风险。
内容的提问来源于stack exchange,提问作者Aenye_Cerbin

