运行循环时Python字典中的重复值

问题描述 投票:0回答:1

我正在使用 pexpect python 模块在多个设备上运行一些远程命令。这是代码:

import pexpect
import sys

devices = ['10.10.10.10', '10.10.10.11']
commands = ['cmd1','cmd2']

command_out = {}
final_dict = {}

for dev in devices:
    child = pexpect.spawn('ssh user@' + dev)
    child.pexpect('assword')
    child.sendline('mypass')
    child.expect('#')
    for cmd in commands:
        child.sendline(cmd)
        child.expect('#')
        command_out[cmd] = child.before
    child.sendline('exit')
    final_dict[dev] = command_out

print(final_dict)

问题是两个设备重复相同的命令输出。

预期输出:

{10.10.10.10: {cmd1: output1_for_first_device, cmd2: output2_for_first_device}, 10.10.10.11: {cmd1: output1_for_second_device, cmd2: output2_for_second_device}}

我得到的实际输出是:

{10.10.10.10: {cmd1: output1_for_second_device, cmd2: output1_for_second_device}, 10.10.10.11: {cmd1: output1_for_second_device, cmd2: output1_for_second_device}}

因此最后一个设备的输出对于每个设备都会重复。

python pexpect
1个回答
0
投票

解决方案:在for循环中定义

command_out = {}

当前问题:字典

final_dict
对于两个设备的
command_out
具有相同的引用,因此
command_out
的最终值反映在
final_dict
中。

演示您的问题的最小示例:

d2 = {}
d1 = {}

for i in range(2):
    d1["foo"] = i
    d2[i] = d1

print(d2)

输出:

{0: {'foo': 1}, 1: {'foo': 1}}
这是你的“实际”输出。

但是在循环内移动

d1
会强制 python 创建一个新的字典。

d2 = {}

for i in range(2):
    d1 = {}
    d1["foo"] = i
    d2[i] = d1

print(d2)

输出:

{0: {'foo': 0}, 1: {'foo': 1}}
这是您的“预期”输出。

© www.soinside.com 2019 - 2024. All rights reserved.