使用python将bash字符串转换为JSON对象

时间:2015-04-03 04:00:42

标签: python json bash sockets

我有一个键值对,我想从嵌入了以下python的bash脚本中导出。 摘自bash脚本:

output_test="ip:192.168.1.150,status:up"
export output_test

上面的bash脚本中的嵌入式python

python -c "$(cat << 'EOF'
import socket
import os
import json
bash_output=string(os.environ["output_test"])
sd = dict(u.split(":") for u in output_test.split(","))
print json.dumps(sd)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 15000))
s.send(bytes(json.dumps(s)))
result = json.loads(s.recv(1024))
print result
s.close()
EOF
)"

我对Python很陌生我会承认,在经过激烈的速度研究之后,我已经将它们融合在一起,而且我将需要它在我的脚本中完成所有这些工作。将名称值对作为json数组发送到套接字。另外,我在上面的例子中的python,sd中给出JSON对象的名称是否会成为JSON数组的名称? - 我想在最终版本中给它一个有意义的名字。

我得到的错误是字符串未定义,我认为这意味着字符串bash_output

3 个答案:

答案 0 :(得分:1)

我同意@achampion,output_test似乎与bash_output混淆了。快速修复可能是:

bash_output=os.environ["output_test"]
sd = dict(u.split(":") for u in bash_output.split(","))

您也可以考虑不以这种方式使用环境变量:

$ output_test="ip:192.168.1.150,status:up"
$ python -c "$(cat << 'EOF'
import socket
import os
import json
import sys
bash_output = sys.argv[1]
sd = dict(u.split(":") for u in bash_output.split(","))
print json.dumps(sd)
EOF
)" $output_test
{"status": "up", "ip": "192.168.1.150"}

答案 1 :(得分:0)

您得到NameError: name 'string' is not defined因为,string未定义。没有名为string的Python内置函数。 os.environ["whatever"]已有str类型,因此您无需任何转化。

当然,这不是唯一的问题。您已将env var指定给bash_output,但稍后尝试使用变量名称output_test。大概这是一个错字,所以你也必须改变它。

一切都得到纠正:

#!/usr/bin/env bash
output_test="ip:192.168.1.150,status:up"
export output_test
python -c "$(cat <<'EOF'
import socket
import os
import json
print(os.environ)
bash_output = os.environ['output_test']
sd = dict(u.split(":") for u in bash_output.split(","))
print json.dumps(sd)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 15000))
s.send(bytes(json.dumps(s)))
result = json.loads(s.recv(1024))
print result
s.close()
EOF
)"

然后我真的不知道你的套接字做什么(除非你提供更多信息),所以你必须确保该部分是正确的。

答案 2 :(得分:0)

这是我使用@ user1556814解决方案的最终代码:

output_test="ip:192.168.1.150,status:up"


python -c "$(cat << 'EOF'
import socket
import os
import json
import sys 
bash_output = sys.argv[1]
sd = dict(u.split(":") for u in bash_output.split(","))
print json.dumps(sd)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 15000))
s.send(bytes(json.dumps(sd)))
s.close()
EOF
)" $output_test

我的问题,请原谅我,这样安全吗?它将在本地计算机上的程序之间发送数据包,最多可能是30个。它们几乎与上面相同,所以非常小,简单的json对象,可能每10秒钟。只是每次运行一个bash脚本并从它运行的命令输出上面的内容(也有一些awk)。 由于我不太熟悉这种语言,我希望我没有错过任何陷阱?这段代码真的简化了我想要做的事情,如果它能够工作,那么,我可以在以后加深我的python知识,当我有更多的时间和更少的恐慌时:)