Shell脚本调用Python函数时屏蔽traceback并自定义异常输出
问题根因
现有逻辑未对Python函数抛出的未捕获异常做处理:Python解释器遇到未捕获异常时,默认会向标准错误流打印traceback回溯信息,同时异常场景下没有向标准输出打印约定内容,导致shell变量y为空。
修改方案
原有test.py的函数逻辑符合要求,无需改动,仅需要调整test.sh中Python调用的相关逻辑即可,修改后的完整test.sh代码如下:
#!/bin/bash X=$1 y=$(python3 -c " from test import f import sys try: print(f(int(sys.argv[1]))) except Exception: print('exception') " "$X" 2>/dev/null) echo "this is y: $y"
改动点说明
- 给Python执行段加了
try/except捕获逻辑:调用f函数触发异常时直接打印固定字符串exception,不让异常跑到Python解释器外层,从根源避免触发默认的traceback打印 - 改用
sys.argv传递shell变量X到Python上下文,替代原有的字符串拼接传参方式,避免特殊入参导致的语法错误、代码注入问题 - 增加
2>/dev/null重定向规则,将Python进程的标准错误流输出丢弃,兜底拦截所有意外的错误信息,保证不会有traceback漏出 - 正常、异常两个场景下Python都会向标准输出打印对应内容,shell变量
y可以稳定拿到赋值,执行bash test.sh 1会输出this is y: 1,执行bash test.sh -1会输出this is y: exception,完全符合预期。
内容的提问来源于stack exchange,提问作者Lawhatre
相关产品推荐
相关产品推荐

