所以我有一个功能设置,它将运行SSH客户端远程到设备,或尝试这样做。如果失败,它将尝试辅助连接,远程激活带内IP,然后在递归循环中重新运行初始函数。
我遇到的问题是在连接到辅助连接成功并激活带内IP后,ssh连接尝试重新开始。不幸的是,for循环再次进入字典的开头,经过之前已连接的连接。我试图在连接成功后删除字典条目,但我无法做到
del Dict[entry]
因为目前正在使用该条目。我收到运行时错误。
RuntimeError: dictionary changed size during iteration
答案 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 = []
与不成功的连接相同。这样我就可以确定之后无法连接的设备。