无法在python字典中使用bash数组?

时间:2018-05-25 15:38:28

标签: python bash

我在bash中有一个由字符串消息组成的数组。 我需要在python中将这些消息用作字典值。像这样:

**Array in Bash**
errorMessage+=("testing the message")
errorMessage+=("this is msg2")

**Function with Python code in Bash**
displayJsonOutput()
{
python - <<END
import json
dict1 = {}
dict1['ScriptName']="$scriptName";
dict1['CaseName']="$option"
dict4={}
dict4['LogFile']="$logFileName";
dict4['ReportFile']="$reportFileName";
for idx in "${!errorMessage[@]}":
        dict4["Message $((idx + 1))"]="${errorMessage[$idx]}";
dict1["Details"]=dict4
print(json.dumps(dict1, indent=4))
END
}

Output shown:
"Details": {
        "LogFile": "/home/output.log",
        "Message 1": "testing the message",
        "ReportFile": "/home/out.rpt"
    },

当我尝试这个时,它只显示第一个消息值。不会通过errorMessage的循环。 我希望json输出值看起来如下所示errorMessage:

"Details": {
    "LogFile": "/home/output.log",
    "Message 1": "testing the message",
    "Message 2": "this is msg2",
    "ReportFile": "/home/out.rpt"
},

1 个答案:

答案 0 :(得分:1)

序列化没有索引的Bash数组,加载到Python数组

导出bash数组以供任何其他语言使用的安全方法是NUL分隔的流。也就是说,对于不需要索引的常规数组:

printf '%s\0' "${errorMessage[@]}" >messageList

...然后在Python中......

errorMessages = open('messageList', 'r').read().split('\0')[:-1]

使用索引序列化Bash数组,加载到Python Dict

如果你需要索引,那么它会改变一点:

for idx in "${!errorMessage[@]}"; do
  printf '%s\0' "$idx" "${errorMessage[$idx]}"
done >messageDict

...在Python方面(构建为概念验证,而不是性能):

pieces = open('messageDict', 'r').read().split('\0')
result = {}
while len(pieces) >= 2:
    k = pieces.pop(0); v = pieces.pop(0);
    result[k] = v

从Bash数字索引数组构建Bash关联数组

如果用“as”作为一个Python字典,你的意思是“喜欢”一个Python字典,这就是一个关联数组的用途。您可以使用arrayName["key"]="value"分配给其中一个;转换描述形式的列表可能如下所示:

declare -a errorMessage=( "Message1" "Message2" )
declare -A dict4=( )

for idx in "${!errorMessage[@]}"; do
  dict4["Message $((idx + 1))"]="${errorMessage[$idx]}"
done