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

Shell脚本调用Python函数获取输出赋值变量为空的解决方法

Shell捕获Python脚本输出为空的修复方案

问题根因

现有代码存在5处问题,导致无法正常获取stridev值:

  • Python脚本未触发目标逻辑:仅定义了gg()函数,没有入口调用代码,直接运行脚本时不会执行NII文件读取、维度拼接的逻辑,无有效输出
  • Python输出存在冗余:原代码同时打印img.shape和stridev,即使捕获成功也会拿到多余内容
  • Shell变量赋值语法错误:Shell规定变量赋值时=两侧不能加空格,原写法stridev1= $(...)会被解析为执行空命令,不会完成赋值操作
  • 输出重定向逻辑错误:2>&1 >/dev/null的执行顺序为先把错误输出绑定到终端,再把标准输出丢入空设备,你需要捕获的stridev属于标准输出,会被直接丢弃
  • 循环索引不匹配:循环自增变量定义为k,取数组值时误用了未定义的i,传给Python的参数为空值

修复后代码

1. 修正Python脚本(保存为pp.py)

核心改动:增加脚本入口调用逻辑,仅打印最终需要捕获的stridev值,去掉冗余打印。注意:Shell无法直接获取Python函数的return值,只能捕获Python进程输出到标准输出的内容,必须通过print()输出目标值。

#!/usr/bin/python3
import sys
import SimpleITK as sitk

def gg(code):
    sample_nii = f'/test/{code}/img_{code}_0000.nii.gz'
    temp = sitk.ReadImage(sample_nii)
    img = sitk.GetArrayFromImage(temp)
    s0 = str(img.shape[0]) + ' '
    s1 = str(img.shape[1]) + ' '
    s2 = str(img.shape[2])
    stridev = s0 + s1 + s2
    return stridev

if __name__ == "__main__":
    # 接收Shell传入的第一个参数
    input_code = sys.argv[1]
    # 仅输出需要捕获的目标值
    print(gg(input_code))

2. 修正Shell脚本

核心改动:修正赋值语法、修正索引、修正输出捕获逻辑,去掉重复的Python调用。

CASES=(0029)
input_path=/nn/

# 遍历CASES数组的所有元素,原写法硬编码循环长度为1扩展性差
for((k=0;k<${#CASES[@]};k++))
do
    # 等号两侧无空格,直接捕获Python的标准输出;如果要屏蔽错误日志可在末尾加 2>/dev/null
    stridev1=$(python3 pp.py "${CASES[k]}")
    echo "hello"
    echo "$stridev1"
    echo "${CASES[k]}"
done

关键注意事项

  • Shell变量赋值时=两侧严禁加空格,加空格后会被识别为命令执行而非赋值
  • 命令替换$(命令)只会捕获命令的标准输出(stdout)内容,Python函数内部的return值不会传递给Shell,必须通过print()输出到标准输出才能被捕获
  • 给Python传参时建议用双引号包裹Shell变量,避免参数带空格时出现解析错误
  • 重定向顺序会影响最终结果:如果要把标准输出和错误输出都丢弃要写>/dev/null 2>&1,顺序写反会导致输出丢弃逻辑失效

内容的提问来源于stack exchange,提问作者Rose A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:45:42