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
相关产品推荐
相关产品推荐

