如何在空python字典中存储命令提示符中的值?

时间:2013-05-23 09:05:26

标签: python linux dictionary

以下是代码:

from subprocess import Popen, PIPE

p1 = Popen(["sysctl", "-a"], stdout=PIPE)
p2 = Popen(["grep", "net.ipv4.icmp_echo_ignore_all"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
print output

p1 = Popen(["sysctl", "-a"], stdout=PIPE)
p3 = Popen(["grep", "net.ipv4.icmp_echo_ignore_broadcasts"], stdin=p1.stdout, stdout=PIPE)
output1 = p3.communicate()[0]
print output1

p1 = Popen(["sysctl", "-a"], stdout=PIPE)
p4 = Popen(["grep", "net.ipv4.ip_forward"], stdin=p1.stdout, stdout=PIPE)
output2 = p4.communicate()[0]
print output2

p1 = Popen(["sysctl", "-a"], stdout=PIPE)
p5 = Popen(["grep", "net.ipv4.tcp_syncookies"], stdin=p1.stdout, stdout=PIPE)
output3 = p5.communicate()[0]
print output3

p1 = Popen(["sysctl", "-a"], stdout=PIPE)
p6 = Popen(["grep", "net.ipv4.conf.all.rp_filter"], stdin=p1.stdout, stdout=PIPE)
output4 = p6.communicate()[0]
print output4

p1 = Popen(["sysctl", "-a"], stdout=PIPE)
p7 = Popen(["grep", "net.ipv4.conf.all.log.martians"], stdin=p1.stdout, stdout=PIPE)
output5 = p7.communicate()[0]
print output5

p1 = Popen(["sysctl", "-a"], stdout=PIPE)
p8 = Popen(["grep", "net.ipv4.conf.all.secure_redirects"], stdin=p1.stdout, stdout=PIPE)
output6 = p8.communicate()[0]
print output6

p1 = Popen(["sysctl", "-a"], stdout=PIPE)
p9 = Popen(["grep", "net.ipv4.conf.all.send_redirects"], stdin=p1.stdout, stdout=PIPE)
output7 = p9.communicate()[0]
print output7

p1 = Popen(["sysctl", "-a"], stdout=PIPE)
p10 = Popen(["grep", "net.ipv4.conf.all.accept_source_route"], stdin=p1.stdout,  stdout=PIPE)
output8 = p10.communicate()[0]
print output8

p1 = Popen(["sysctl", "-a"], stdout=PIPE)
p11 = Popen(["grep", "net.ipv4.conf.all.accept_redirects"], stdin=p1.stdout, stdout=PIPE)
output9 = p11.communicate()[0]
print output9


p1 = Popen(["sysctl", "-a"], stdout=PIPE)
p12 = Popen(["grep", "net.ipv4.tcp_max_syn_backlog"], stdin=p1.stdout, stdout=PIPE)
output10 = p12.communicate()[0]
print output10

current_kernel_para = dict()            #new dictionary to store the above kernel parameters

以上程序的输出是:

net.ipv4.icmp_echo_ignore_all = 0

net.ipv4.icmp_echo_ignore_broadcasts = 1

net.ipv4.ip_forward = 0

net.ipv4.tcp_syncookies = 1

net.ipv4.conf.all.rp_filter = 0

net.ipv4.conf.all.log_martians = 0

net.ipv4.conf.all.secure_redirects = 1

net.ipv4.conf.all.send_redirects = 1

net.ipv4.conf.all.accept_source_route = 0

net.ipv4.conf.all.accept_redirects = 1

net.ipv4.tcp_max_syn_backlog = 512

我想将这些值存储在字典“current_kernel_para”中。所需的输出是: {net.ipv4.icmp_echo_ignore_all:0,net.ipv4.icmp_echo_ignore_broadcasts:1}等。

请帮忙。提前谢谢。

4 个答案:

答案 0 :(得分:3)

你可以将字符串拆分为“=”,并使用第一个作为键,第二个标记作为值。

答案 1 :(得分:0)

将输出拆分为'='

x = output.split(' = ')

这会给:

['net.ipv4.conf.all.send_redirects', '1']

然后,您可以将所有这些列表一起添加并使用:

x = ['net.ipv4.icmp_echo_ignore_all', '0', 'net.ipv4.conf.all.send_redirects', '1'...]
dict_x = dict(x[i:i+2] for i in range(0, len(x), 2))

答案 2 :(得分:0)

current_kernel_para = {}
paras = ["net.ipv4.icmp_echo_ignore_all",
        "net.ipv4.icmp_echo_ignore_broadcasts", #...
       ]
for para in paras:
    p1 = Popen(["sysctl", "-a"], stdout=PIPE)
    p2 = Popen(["grep", para], stdin=p1.stdout, stdout=PIPE)
    output = p2.communicate()[0]
    output.strip()
    k, v = map(strip, output.split('='))
    current_kernel_para[k] = v

答案 3 :(得分:0)

不是将每个输出分配给新变量,而是将其作为列表收集。请记住删除尾随\n

outputs = []

p1 = Popen(["sysctl", "-a"], stdout=PIPE)
p2 = Popen(["grep", "net.ipv4.icmp_echo_ignore_all"], stdin=p1.stdout, stdout=PIPE)
outputs.append(p2.communicate()[0].strip('\n'))

p1 = Popen(["sysctl", "-a"], stdout=PIPE)
p3 = Popen(["grep", "net.ipv4.icmp_echo_ignore_broadcasts"], stdin=p1.stdout, stdout=PIPE)
outputs.append(p3.communicate()[0].strip('\n'))

这给出了

>>> outputs
['net.ipv4.icmp_echo_ignore_all = 0', 'net.ipv4.icmp_echo_ignore_broadcasts = 1']

然后,您可以在=列表中拆分列表中的每个字符串,并将结果收集为list of lists

outputs_list=[x.split('=') for x in outputs]

给出

>>> outputs_list
[['net.ipv4.icmp_echo_ignore_all ', ' 0'], ['net.ipv4.icmp_echo_ignore_broadcasts ', ' 1']]

很好,但它有前导/尾随空格。让我们把那些剥离出来

outputs_list=[[y.strip() for y in x.split('=')] for x in outputs]

这给出了

>>> outputs_list
[['net.ipv4.icmp_echo_ignore_all', '0'], ['net.ipv4.icmp_echo_ignore_broadcasts', '1']]

dict()构造函数也传递给它以形成字典

>>> dict(outputs_list)
{'net.ipv4.icmp_echo_ignore_all': '0', 'net.ipv4.icmp_echo_ignore_broadcasts': '1'}