2016-11-14 86 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

使用POP 例如 d.pop( 'A',0) 其中,a是您要刪除的關鍵字,並且鍵值對將從字典中刪除,可能是字典

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

這裏是我做過什麼:

我與流行音樂和德爾募集錯誤的問題,所以我創建了當前使用的設備的IP在一個單獨的SSH功能循環。這樣,我沒有多次遍歷循環。下面是單獨的功能:

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 = [] 

同樣的,不成功的連接。這將允許我確定之後無法連接的設備。