2016-11-14 5 views
1

Итак, у меня есть функция настройки, где она будет запускать SSH-клиент удаленно на устройство или пытаться сделать это. Если это не удастся, он попытается подключиться к вторичному соединению, удаленному для активации внутриполосного IP-адреса, а затем перезапустить начальную функцию в рекурсивном цикле.Удаление словарной записи при итерации через словарь

Проблема, с которой я столкнулась, связана с успешным подключением к вторичному соединению, и активируется внутриполосный IP-адрес, попытка подключения ssh начинается. К сожалению, цикл for снова возвращается к началу словаря, переходя к уже подключенным ранее соединениям. Я пытаюсь удаления словарных статей после того, как соединение успешно, но я не могу сделать

del Dict[entry] 

поскольку запись используется в настоящее время. Я получаю ошибку времени выполнения.

RuntimeError: dictionary changed size during iteration 

ответ

0

Вы можете хранить свои записи в отдельный список и удалить их после

псевдокод:

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

for successful_connection in successful_connections: 
    del Dict[successful_connection] 
0

Использование поп Для примера d.pop ('а', 0) Если a - это ключ, который вы хотите удалить, а пара значений ключа будет удалена, словарь

0

Используйте popitem с некоторое время петли:

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) 
0

Вот что я сделал:

У меня была проблема с поп-и-дель ошибок осведомленности, поэтому я создал отдельную функцию 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://[email protected]/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 я использую), Имя_устройства текущего значения хэша в словаре.

Успешные соединения должны были быть объявлены с большей функции с:

global successful_connections 
successful_connections = [] 

То же с неуспешных соединений. Это позволит мне определить устройства, которые впоследствии не могли подключиться.