return 如何从 python 脚本到 shell 脚本?

How to return result from python script to shell script?

我有一个 python 脚本 a.py,它是 shell 脚本 b.sh 的 运行。我希望 return a.py 的结果(整数)到 b.sh

我知道我可以在 a.py 中使用 sys.exit(result)。但是正如我在 b.sh 中写的 set -ex,shell 脚本在 运行 宁 a.py 之后停止。我不想使用 print(result) eater,因为我希望在 a.py.

中打印其他信息

是否有任何其他方法可以将 return 从 a.py 转换为 b.sh

您可以 return 来自 python 脚本的退出代码,并通过 $? 在 shell 脚本中查找(并在必要时重新分配给另一个变量) :

foo.py:

import sys
sys.exit(35)

foo.sh:

python foo.py
echo $?

运行 脚本:

> sh foo.sh
35

你可以这样做:

{ a.py; result=$?; } || true
# the result of a.py is in $result

|| true 暂时禁用 set -e,并且 $? 特殊变量在被下一个命令覆盖之前存储到 $result

缺点是,如果您的脚本实际上失败了(例如通过引发异常),您不会注意到这一点。一个更强大的解决方案是打印所需的结果并将其作为输出捕获,并将其他输出打印到标准错误。

我同意 chepner,退出代码不应用于整数传递。 为什么不通过标准输出传递 python 文件的输出?

value="$(python foo.py)"
echo "${value}"

我建议将整数值写入文件。我完全同意退出代码不应用于传递任何信息,除了程序的成功或失败。

例如b.sh:

#! /bin/bash
set -ex

# Create temp file, ensure it is erased on bash script exit
tempfile="$(mktemp)"
trap 'rm -f "$tempfile"' EXIT
trap 'exit 1' HUP INT QUIT PIPE TERM

# Run program and write value to temp file
python3 ./a.py -o "$tempfile"

# Read value from temp file
myvalue="$(cat "$tempfile")"

echo "Value from a.py was: $myvalue"

a.py:

#! /usr/bin/env python3

import argparse
from pathlib import Path

parser = argparse.ArgumentParser()
parser.add_argument(
    "-o",
    "--output-file",
    help="Write integer value to text file",
    type=str,
    required=True,
)
args = parser.parse_args()

my_value = 42
Path(args.output_file).write_text(str(my_value))