用shell调用Python并捕获输出

6

我已经用shell编写了一个程序。在这个shell脚本中,我调用了一个python脚本。这个过程可以正常工作。

我希望我的python脚本将输出返回给shell脚本。

(我在谷歌上没有找到任何相关的方法。)

如果可能,请告诉我如何做到这一点?

test.sh


#!/bin/bash
python call_py.py

以及Python脚本(call_py.py

#!/usr/bin/python
if some_check:
    "return working"
else:
    "return not working"

我该如何从python中返回并在shell中捕获错误?
2个回答

8

要将命令的输出存储在变量中,可以使用进程替换:

var=$( cmd )

eg

var=$( ls $HOME )

或者

var=$( python myscript.py)
$()与反引号语法几乎完全等效,但反引号语法已被弃用,建议使用$()。
如果您的意图是返回一个字符串'working'或'not working'并在shell脚本中使用该值来确定python脚本是否成功,那么请改变您的计划。更好的方法是使用返回值。例如,在python中,您可以'return 0'或'return 1'(零表示成功,1表示失败),然后shell脚本只需:
if python call_py.py; then
  echo success
else
  echo failure
fi

1
在Python中,我们可以使用sys.exit(0)表示成功,使用sys.exit(1)表示失败。 - Aakash Goyal
这个天真的解决方案即使进行以下修改也无法工作:$(python -u some_pyunit_tests.py 2>&1) - Alex Jansen
@AlexJohnson 嗯?您的示例将Python脚本写入的数据分配给左侧的变量,以便将其发送到文件描述符1或2(例如stdout和stderr)。这种方式有什么问题吗? - William Pursell
我不知道,这让我发疯。我最好的猜测是pyunit中有一些黑魔法,它会生成一个单独的进程,从外部子shell中重定向输出到终端。屏幕上会显示一些东西,但我似乎无法将其捕获到文件或变量中。 - Alex Jansen

6
使用$(...)将命令的标准输出捕获为字符串。
output=$(./script.py)
echo "output was '$output'"

if [[ $output == foobar ]]; then
    do-something
else
    do-something-else
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接