【问题标题】:How to access python return value from bash script如何从bash脚本访问python返回值
【发布时间】:2018-06-25 01:56:26
【问题描述】:

我试图了解如何从 bash 脚本访问 python 脚本的返回值。

举例说明:

foo.py

def main():
    print ("exec main..")
    return "execution ok"

if __name__ == '__main__':
    main()

start.sh

script_output=$(python foo.py 2>&1)
echo $script_output

如果我运行 bash 脚本,则会打印消息“exec main..”。

如何在 script_output 中存储返回值(执行成功)? 如果我将 execution ok 定向到标准输出,则 script_output 将捕获所有标准输出(因此 2 打印语句)。

有什么方法可以实现吗?

谢谢! 阿莱西奥

【问题讨论】:

  • 我认为更自然的解决方案是让 python 脚本写入文件,然后由 bash 脚本读取。

标签: python linux bash shell


【解决方案1】:

使用sys.exit() 模块从脚本中添加正确的退出代码。通常命令在脚本成功完成时返回 0。

import sys

def main():
    print ("exec main..")
    sys.exit(0)

并使用简单的条件将其捕获到 shell 脚本中。虽然退出代码默认为 0 并且不需要显式传递 ,但使用 sys.exit() 可以控制在错误情况下返回非零代码,以了解与脚本的一些不一致之处。

if python foo.py 2>&1 >/dev/null; then
    echo 'script ran fine'
fi

【讨论】:

  • sys.exit(0) 有必要吗?您可以通过$?自动获取退出状态,如果您想通知用户此脚本手动运行成功则只有我们使用sys.exit(code)
  • @AvinashRaj:是的,文档说它是可选的。但我认为,如果您可以控制脚本,那么发送代码以确保它是安全的
  • 嘿@Inian,您的解决方案看起来比写一些东西到 stderr 并从 bash 中获取它的输出更优雅。它与我正在寻找的东西足够接近!谢谢!
  • @AvinashRaj: sys.exit([error code]) 是必要的,因为 python 脚本可能会在内部因错误而结束,但 python 进程无论如何都会返回零。这样您就可以将错误信号强制发送给其他进程。
  • 你能解释一下你的命令在做什么吗?特别是 dev null 部分? python foo.py 2>&1 >/dev/null?
【解决方案2】:

可以通过$?获取上一条命令的输出状态。如果python脚本在没有任何stderr的情况下成功运行,它应该返回0作为退出代码,否则它将返回1或0以外的任何数字。

#!/bin/bash
python foo.py 2>&1 /dev/null
script_output=$?
echo $script_output

【讨论】:

  • 你能解释一下你的命令在做什么吗?特别是 dev null 部分? python foo.py 2>&1 >/dev/null?
【解决方案3】:

Bash 仅包含$? 中的返回码,因此您不能使用它来打印 python 的 return 中的文本。 我的解决方案是在 python 脚本中写入标准错误,然后在 bash 中只打印标准错误:

import sys
    
    
def main():
    print ("exec main..")
    sys.stderr.write('execution ok\n')
    return "execution ok"
    
if __name__ == '__main__':
    main()

重击:

#!/bin/bash
    
script_output=$(python foo.py 1>/dev/null)
echo $script_output

输出:

execution ok

【讨论】:

  • 我想避免在这里向 stderr 写任何东西,如果我没有在我的问题中指定,我很抱歉。
  • @AlessioG 好吧,我认为 Inian 的解决方案最适合你。
  • 你能解释一下你的命令在做什么吗?特别是 dev null 部分? python foo.py 2>&1 >/dev/null?
猜你喜欢
  • 2018-04-20
  • 1970-01-01
  • 2018-07-02
  • 2012-04-22
  • 2022-10-14
  • 2012-08-07
  • 2011-10-13
  • 2016-03-14
  • 2017-02-07
相关资源
最近更新 更多