如何将多个变量从python返回到bash

时间:2013-06-21 15:09:44

标签: python bash scripting return multiple-value

我有一个调用python脚本的bash脚本。起初我只是返回一个变量,这很好,但现在我被告知返回两个变量,我想知道是否有一个简洁的方法来返回多个变量。

archiveID=$(python glacier_upload.py $archive_file_name $CURRENTVAULT)

我是来自bash的电话

print archive_id['ArchiveId']
archive_id['ArchiveId']

这会将归档ID返回给bash脚本

通常我知道你可以在python中使用return语句来返回多个变量,但是它只是一个脚本,就像我发现返回变量一样。我可以把它变成一个被调用的函数,但即便如此,我将如何收到我将要传回的多个变量?

2 个答案:

答案 0 :(得分:5)

从你的python脚本中,每行输出一个变量。然后从你的bash脚本,每行读取一个变量:

的Python

print "foo bar"
print 5

#! /bin/bash

python main.py | while read line ; do
    echo $line
done

最终解决方案:

谢谢纪尧姆!你给了我灵魂的一个很好的起点。我将在这里为其他人发布我的解决方案。

#! /bin/bash

array=()
while read line ; do
  array+=($line)
done < <(python main.py)
echo ${array[@]}

我找到了我需要的其余解决方案here

答案 1 :(得分:2)

我最喜欢的方式是直接阅读列表:

x=($(python3 -c "print('a','b','c')"))
echo ${x[1]}
b
echo ${x[*]}
a b c

由于这个原因,如果my_python_function返回一个元组,我将使用format来确保我得到的是空格分隔的结果:

#Assuming a tuple of length 3 is returned
#Remember to quote in case of a space in a single parameter!
print('"{}" "{}" "{}"'.format(*my_python_function())

如果要使其通用,则需要构造格式字符串:

res = my_python_function()
print(("{} "*len(res)).format(*res))

是一种方法。无需担心额外的空间,但是您可以在格式字符串上使用[:-1]摆脱它。

最后,如果您期望使用多字参数(例如,单个参数中有一个空格,则需要添加引号和一定程度的间接性(我假设您将只运行自己的“安全”脚本) ):

#myfile.py
res = my_python_function()
print(('"{}" '*len(res)).format(*res))

#my file.bash
eval x=($(python3 myfile.py))