我正在使用 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}}
因此最后一个设备的输出对于每个设备都会重复。
解决方案:在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}}
这是您的“预期”输出。