将Python数据列表转换为bash数组

时间:2014-10-02 13:54:40

标签: arrays bash list

我有一个调用python脚本的bash脚本,如下所示:

OUTPUT=$(python /path/path/script.py attr attr attr);

python脚本将返回如下数据列表:

[item1, item2, item3]

如何将$ OUPUT变量(返回python数据列表的字符串)转换为bash数组?

如果可能的话,我想用bash阅读每个项目。

5 个答案:

答案 0 :(得分:23)

添加()| tr -d '[],'

OUTPUT=($(python /path/path/script.py attr attr attr | tr -d '[],'))

echo ${OUTPUT[0]}
echo ${OUTPUT[1]}
echo ${OUTPUT[2]}
echo ${OUTPUT[@]}

输出:

item1
item2
item3
item1 item2 item3

答案 1 :(得分:2)

你可以让你的script.py打印一个字符串,用空格分隔每个项目,Bash将转换为数组,或者你可以使用Bash将python脚本的返回值转换为你想要的格式。

如果您选择从script.py打印字符串,则可以使用以下python代码:

returnList = [1, 2, 3]
returnStr = ''
for item in returnList:
    returnStr += str(item)+' '
print(returnStr)

在这种情况下,以下bash脚本的输出:

OUTPUT=$(python /path/to/script.py)
echo $OUTPUT
for i in $OUTPUT;
do
    echo $i
done

是:

1 2 3
1
2
3

希望这会对你有所帮助。

答案 2 :(得分:1)

Bash声明这样的数组:

foo=(bar baz ban)

要将空格分隔的命令输出转换为数组,您可以这样做:

foo=($(my_command))

在Python中将列表转换为空格分隔字符串非常简单:

' '.join(my_array)

如果您print而不是列表本身,则可以将其简单地转换为数组。

答案 3 :(得分:1)

我会使用一个简短的Python包装器将字符串转换为bash更易解析的内容。

# Proxy for script.py output that includes some potential bash pitfalls
python_output="['a b', 'c*', 6]"

# Let Python output each element of the list as a separate line;
# the only thing this cannot handle is multi-line elements; workarounds
# are possible, but not worth getting into unless necessary. 
while read -r; do
    OUTPUT+=("$REPLY")
done < <(python -c 'import ast, sys
print "\n".join(str(x) for x in ast.literal_eval(sys.argv[1]))
' "$python_output")

# Verify that each element was added to the array unscathed.
for e in "${OUTPUT[@]}"; do
    echo "$e"
done

bash 4中,您可以使用readarray命令替换while循环:

readarray -t OUTPUT < <(python -c ... )

答案 4 :(得分:-1)

如果你只是想在python的python列表中创建一个bash列表,你可以使用这个单行:

python -c 'print(" ".join([str(elem) for elem in [1, "l", 12]]))'

它直接为您提供列表:

1 l 12

请注意,它需要修改python代码,而不是从外部bash代码执行此操作。