You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:35:40