在bash中收集python函数的返回值

4 投票
1 回答
3220 浏览
提问于 2025-04-18 11:59

我正在写一个bash脚本,这个脚本会调用一个python脚本里的函数。我想把这个函数的返回值存到调用的bash脚本里的一个局部变量中。

try1.sh文件里包含:

#!/bin/sh
RETURN_VALUE=`python -c 'import try3; try3.printTry()'`
echo $RETURN_VALUE

现在来看python脚本:

#!/usr/bin/python

def printTry():
    print 'Hello World'
    return 'true'

当我执行bash脚本时:

$./tr1.sh
Hello World

在输出中没有看到'真'或者其他任何我想要的类型。

我还想做的另一件事是,我的实际python代码大约有20到30个函数,这些函数会返回我软件状态机的各种状态值,我会从bash脚本中调用这些函数。在bash脚本中,我需要把这些返回值存储在局部变量中,以便在后面的状态机逻辑中使用。

对于每个值,我都得用python -c 'import python_module; python_module.method_name',这会一次又一次地重新枚举状态机的定义状态,我不想这样。我希望避免为了调用一个单独的函数而让整个python脚本运行。这样做有可能吗?

这里有什么可能的解决方案、建议或想法吗?

我会很感激大家的回复。

为了澄清我的意图,这个任务是希望用python脚本的一部分来替代bash脚本的一部分,以提高可读性。bash脚本真的很大(大约15000行),所以不能完全用一个python脚本替代。因此,可以识别出需要改进的部分可以用python替代。

另外,我曾考虑过完全用python脚本替代整个bash脚本,正如Victor在下面的评论中建议的那样,但在我的情况下这并不可行。因此,我需要将状态机分成bash和python两部分,其中python会有一些必要的方法来返回bash脚本所需的状态值。

祝好,
Yusuf Husainy。

1 个回答

3

如果你不在乎这个Python函数打印到标准输出(stdout)上的内容,你可以这样做:

$ py_ret_val=$(python -c '
from __future__ import print_function
import sys, try3
print(try3.printTry(), file=sys.stderr)
' 2>&1 1>/dev/null)

$ echo $py_ret_val
true

撰写回答