【问题标题】:Return Values from Python Script to Bash Script is different when used with Print Statement与 Print 语句一起使用时,从 Python 脚本到 Bash 脚本的返回值不同
【发布时间】:2022-07-27 21:40:43
【问题描述】:

我有一个 bash 命令如下:

    dependencies=$(/path/to/my-profiles.py --my-profiles pytest)
    IFS=' ' read -r -a arr <<<"$dependencies"
    declare -p arr

    for i in "${arr[@]}"
    do
        echo "$i"
    done

我的 Python 脚本如下:

my-script.py
def main():
    parser = argparse.ArgumentParser(description='My script')
    parser.add_argument('--my-profiles', dest="profiles", 
                        type=str,
                        default='')
    parsed_args = parser.parse_args()
    dependencies = get_dependencies(args.profiles)
    return dependencies

def get_dependencies(profiles):
    return ' '.join([
       'mock-alchemy', 'pytest-mock', 'pytest-datafixtures', 'pytest-describe', 'pytest-unordered', 'requests-mock'
       ])

当我使用上面的 python 脚本运行 bash 脚本时,我得到如下输出:

mock-alchemy pytest-mock pytest-datafixtures pytest-describe pytest-unordered requests-mock
declare -a arr='()'

但是,如果我在我的 python 脚本中添加 print 语句,我会得到我想要的结果:

my-script.py
def main():
    parser = argparse.ArgumentParser(description='My script')
    parser.add_argument('--tox-profiles', dest="profiles", 
                        type=str,
                        default='')
    parsed_args = parser.parse_args()
    dependencies = get_dependencies(args.profiles)
    print(dependencies)
    return dependencies

def get_dependencies(profiles):
    return ' '.join([
       'mock-alchemy', 'pytest-mock', 'pytest-datafixtures', 'pytest-describe', 'pytest-unordered', 'requests-mock'
       ])

在脚本中添加打印语句,我得到以下结果:

mock-alchemy pytest-mock pytest-datafixtures pytest-describe pytest-unordered requests-mock
declare -a arr='([0]="mock-alchemy" [1]="pytest-mock" [2]="pytest-datafixtures" [3]="pytest-describe" [4]="pytest-unordered" [5]="requests-mock")'
mock-alchemy
pytest-mock
pytest-datafixtures
pytest-describe
pytest-unordered
requests-mock

我希望我的解决方案为第二种类型,但我不想添加打印语句。我想知道我做错了什么以及如何解决?

【问题讨论】:

    标签: python bash


    【解决方案1】:

    main 可以返回一个值,但它不会以任何方式暴露给 shell。您不能将任意数据从一个进程返回到另一个进程;您只能写入文件(在最宽松的意义上使用“文件”;可以是磁盘文件、套接字、管道等)

    将结果写入标准输出并让外壳程序捕获该输出,就像您所做的那样,是子级与其父级通信的标准方法。

    因此,return 语句是不必要的。

    def main():
        parser = argparse.ArgumentParser(description='My script')
        parser.add_argument('--tox-profiles', dest="profiles", 
                            type=str,
                            default='')
        parsed_args = parser.parse_args()
        dependencies = get_dependencies(args.profiles)
        print(dependencies)
    

    【讨论】:

    • 但是,我引入print语句,怎么会返回shell呢?
    • 它没有返回任何东西。您的 Python 脚本写入标准输出,$(...)(命令替换)捕获该输出并将其分配给您的 shell 变量。
    猜你喜欢
    • 1970-01-01
    • 2016-03-14
    • 2018-04-20
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 2018-06-25
    • 2012-10-28
    • 2013-07-16
    相关资源
    最近更新 更多