我有一个键值对,我想从嵌入了以下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
答案 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知识,当我有更多的时间和更少的恐慌时:)