从我的 python 解析器脚本创建 Json 输出
Create Json output from my python parser script
我编写了一个 python 脚本,其中我根据需要使用 dkpg -l 命令中的 perl 解析大部分输出。我试图对输出做的是创建一个 json 结构输出文件,如下所示。
我是 python 的新手,所以想寻找一些提示,了解我在这里生成这样一个具有数组结构的 json 文件的最佳选择是什么?
Json 文件
{
"hostname": "xyz-abc-m001",
"publicIP": "111.00.00.xxx",
"privateIP": "10.xxx.xx.61",
"kernal": "4.4.0-72-generic #93-Ubuntu",
"package": [
{ "name":"nfs-common", "installed":"1:1.2.8-9ubuntu12", "available":"1:1.2.8-9ubuntu12.1" },
{ "name":"grub-common", "installed":"2.02~beta2-36ubuntu3.8", "available":"2.02~beta2-36ubuntu3.9" },
{ "name":"wget", "installed":"1.17.1-1ubuntu1.1", "available":"1.17.1-1ubuntu1.2" }
]
}
Python 脚本
import socket
import os
import subprocess
from subprocess import Popen, PIPE
#Getting Hostname of the machine
hostname=socket.gethostname()
#Getting private IP of the machine on eth0
f = os.popen(" ip addr show eth0 | grep -Po 'inet \K[\d.]+' ")
private_ip=f.read()
#Getting public IP of the machine on eth1
f = os.popen(" ip addr show eth1 | grep -Po 'inet \K[\d.]+' ")
public_ip=f.read()
#Getting currently running linux kernal
f = os.popen(" uname -a | awk '{print , }' ")
running_kernal=f.read()
pipe = Popen(" apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print \" \n\"} ' ", shell=True, stdout=PIPE)
for line in pipe.stdout:
parts = line.split() # split line into parts
if len(parts) > 1: # if at least 2 parts/columns
print "Hostname = %s PublicIP = %s PrivateIP = %s Package name = %s INSTALLED = %s AVAILABLE = %s kernal = %s " % (hostname, public_ip, private_ip, parts[0], parts[1], parts[2], running_kernal)
有一个图书馆!
import json
使用这个你可以获取你的数据结构...并将其转换为 json!
data = [1, 2, 3, {"hello world":42}]
myjson = json.dumps(data)
...基本上就是这样。使用 json.loads
和 json.load
分别从 json class 和 json 文件加载。
您可以在 this website
找到更多信息
P.S。如果你想用缩进打印,试试
some_dictionary = {'hostname':hostname, 'PublicIP':publicIp, etc}
print(json.dumps(some_dictionary, indent=4))`
我编写了一个 python 脚本,其中我根据需要使用 dkpg -l 命令中的 perl 解析大部分输出。我试图对输出做的是创建一个 json 结构输出文件,如下所示。
我是 python 的新手,所以想寻找一些提示,了解我在这里生成这样一个具有数组结构的 json 文件的最佳选择是什么?
Json 文件
{
"hostname": "xyz-abc-m001",
"publicIP": "111.00.00.xxx",
"privateIP": "10.xxx.xx.61",
"kernal": "4.4.0-72-generic #93-Ubuntu",
"package": [
{ "name":"nfs-common", "installed":"1:1.2.8-9ubuntu12", "available":"1:1.2.8-9ubuntu12.1" },
{ "name":"grub-common", "installed":"2.02~beta2-36ubuntu3.8", "available":"2.02~beta2-36ubuntu3.9" },
{ "name":"wget", "installed":"1.17.1-1ubuntu1.1", "available":"1.17.1-1ubuntu1.2" }
]
}
Python 脚本
import socket
import os
import subprocess
from subprocess import Popen, PIPE
#Getting Hostname of the machine
hostname=socket.gethostname()
#Getting private IP of the machine on eth0
f = os.popen(" ip addr show eth0 | grep -Po 'inet \K[\d.]+' ")
private_ip=f.read()
#Getting public IP of the machine on eth1
f = os.popen(" ip addr show eth1 | grep -Po 'inet \K[\d.]+' ")
public_ip=f.read()
#Getting currently running linux kernal
f = os.popen(" uname -a | awk '{print , }' ")
running_kernal=f.read()
pipe = Popen(" apt-get --just-print upgrade 2>&1 | perl -ne 'if (/Inst\s([\w,\-,\d,\.,~,:,\+]+)\s\[([\w,\-,\d,\.,~,:,\+]+)\]\s\(([\w,\-,\d,\.,~,:,\+]+)\)? /i) {print \" \n\"} ' ", shell=True, stdout=PIPE)
for line in pipe.stdout:
parts = line.split() # split line into parts
if len(parts) > 1: # if at least 2 parts/columns
print "Hostname = %s PublicIP = %s PrivateIP = %s Package name = %s INSTALLED = %s AVAILABLE = %s kernal = %s " % (hostname, public_ip, private_ip, parts[0], parts[1], parts[2], running_kernal)
有一个图书馆!
import json
使用这个你可以获取你的数据结构...并将其转换为 json!
data = [1, 2, 3, {"hello world":42}]
myjson = json.dumps(data)
...基本上就是这样。使用 json.loads
和 json.load
分别从 json class 和 json 文件加载。
您可以在 this website
P.S。如果你想用缩进打印,试试
some_dictionary = {'hostname':hostname, 'PublicIP':publicIp, etc}
print(json.dumps(some_dictionary, indent=4))`