从 Bash 脚本执行时,Python 函数返回不同的值

Posted

技术标签:

【中文标题】从 Bash 脚本执行时,Python 函数返回不同的值【英文标题】:Python function returns different values when executed from a Bash script 【发布时间】:2021-05-04 16:24:37 【问题描述】:

我有一个示例 Python 文件“Test_exit.py”:

import os

def test_exit():
    print('Line 1.\n')
    print('Line 2.\n')
    exit (17)

if __name__ == '__main__':
    test_exit()

当我使用 Python 执行它时,它按预期工作:

ubuntu@ip-172-31-9-235:~$ python3 Test_exit.py
Line 1.

Line 2.

当我检查返回的错误代码时,它确实按预期打印“17”:

ubuntu@ip-172-31-9-235:~$ echo $?
17

但是,当我从 Bash 脚本“Test_exit.sh”执行相同的 Python 文件时,情况会有所不同:

#!/bin/bash

    Exit_code=$(python3 Test_exit.py)
    echo $Exit_code 

我希望它回显“17”,但它没有:

ubuntu@ip-172-31-9-235:~$ ./Test_exit.sh
Line 1. Line 2.

不仅没有回显“17”,而且现在这两行打印出来没有换行了……

如果我将exit (17) 替换为sys.exit (17),则不会打印任何内容,甚至不会打印一行中的两行...

我的代码有什么问题? exit 不仅会导致 Python 存在,还会导致 Bash 脚本存在吗? 为什么根据调用 Python 的方式打印的字符串会有所不同?

编辑

按照@choroba 的建议,以下是运行良好的脚本:

#!/bin/bash

    output=$(python3 Test_exit.py)
    Exit_code=$?
    echo "$Exit_code"
    echo "$output"

【问题讨论】:

【参考方案1】:

命令替换$(...) 不返回退出代码,它捕获输出。使用$?查看退出代码。

output=$(python3 Test_exit.py)
exit_code=$?

要获得准确的输出,您需要对变量进行双引号:

echo "$Exit_code"

如果没有引号,变量会被扩展并进行分词,因此输出中的每个单词都被视为echo 的单独参数,从而将空格减少为单个空格。

【讨论】:

非常感谢@choroba 的快速而有用的回答!

以上是关于从 Bash 脚本执行时,Python 函数返回不同的值的主要内容,如果未能解决你的问题,请参考以下文章

bash脚本返回值应用

将 Python 脚本的返回值存储在 bash 脚本中

如何从 Bash 脚本中检查程序是不是存在?

Bash 函数中的返回值

用于从文件中选择单个 Python 函数的 Bash 脚本

将python脚本的输出返回到bash变量[重复]