在迭代字典时删除字典条目

时间:2016-11-14 19:18:38

标签: python ssh network-programming

所以我有一个功能设置,它将运行SSH客户端远程到设备,或尝试这样做。如果失败,它将尝试辅助连接,远程激活带内IP,然后在递归循环中重新运行初始函数。

我遇到的问题是在连接到辅助连接成功并激活带内IP后,ssh连接尝试重新开始。不幸的是,for循环再次进入字典的开头,经过之前已连接的连接。我试图在连接成功后删除字典条目,但我无法做到

del Dict[entry]

因为目前正在使用该条目。我收到运行时错误。

RuntimeError: dictionary changed size during iteration

4 个答案:

答案 0 :(得分:0)

您可以将条目存储在单独的列表中,然后将其删除

伪代码:

successful_connections = []
for ...:
    [...]
    if successful:
        successful_connections.append(entry)

for successful_connection in successful_connections:
    del Dict[successful_connection]

答案 1 :(得分:0)

使用pop 例如 d.pop('一个',0) 其中a是您要删除的键,键值对将从字典中删除

答案 2 :(得分:0)

popitem与while循环一起使用:

def fn(d):
    while d:
        k, v = d.popitem()
        if v < 5:
            d[k] = v + 1
            fn(d)
        else:
            print((k, v))

>>> x = dict(a=0, b=3, c=9, d=5, e=2)
>>> fn(x)
('b', 5)
('c', 9)
('d', 5)
('e', 5)
('a', 5)

答案 3 :(得分:0)

这是我做的:

我遇到了pop和del raise错误的问题,所以我创建了一个单独的SSH函数,它在循环中使用了当前的设备IP。这样,我没有多次迭代循环。这是单独的功能:

def backup_config_single(rootpass, device_ip, device, DeviceName):
  try:
      net_connect = ConnectHandler(device_type = device, ip = device_ip, username = usernamepre, password = passwordpre)
      output = net_connect.send_command('copy running-config scp://root@192.168.1.61/Documents/backups/%s.txt\n\n\n\n%s\n' % (DeviceName, rootpass))
      net_connect.disconnect()
      successful_connections.append(DeviceName)
  except:
      unsuccessful_connections.append(DeviceName)

rootpass用于SCP服务器,device_ip是交换机/路由器IP,设备是netmiko所需的参数(SSH客户端我正在使用),DeviceName是字典中的当前哈希值。

必须使用以下函数从更大的函数声明成功的连接:

global successful_connections
successful_connections = []

与不成功的连接相同。这样我就可以确定之后无法连接的设备。