2016-11-14 14 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( 'A'、0) ここで、削除するキーをaとし、キー値のペアを削除します。

0

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です、デバイスは、DeviceNameには、現在のハッシュ値netmikoに必要なパラメータ(私が使用しているSSHクライアント)です辞書に失敗した接続と同じ

global successful_connections 
successful_connections = [] 

成功した接続が持つ大きな機能から宣言されなければなりませんでした。これにより、後で接続できなかったデバイスを特定できます。

関連する問題