2011-08-23 12 views
9

Sto eseguendo il debug di alcuni codici, il che comporta il costante accesso/uscita di alcuni server sftp esterni. Qualcuno sa se paramiko chiude automaticamente una sessione ssh/sftp sul server esterno se viene sollevata un'eccezione non paramiko nel codice? Non riesco a trovarlo nei documenti e poiché le connessioni devono essere fatte abbastanza presto in ogni iterazione, non voglio finire con 20 connessioni aperte.Il paramiko chiude la connessione ssh su un'eccezione non paramiko

risposta

15

No, paramiko non chiuderà automaticamente la sessione ssh/sftp. Non importa se l'eccezione è stata generata dal codice paramiko o in altro modo; non c'è nulla nel codice paramiko che cattura le eccezioni e le chiude automaticamente, quindi devi farlo tu stesso.

È possibile garantire che venga chiuso avvolgendolo in un try/finally bloccare in questo modo:

client = None 
try: 
    client = SSHClient() 
    client.load_system_host_keys() 
    client.connect('ssh.example.com') 
    stdin, stdout, stderr = client.exec_command('ls -l') 
finally: 
    if client: 
     client.close() 
+0

Grazie, il problema era che stavo eseguendo il debug di alcune migliaia di righe di codice (e ci sto ancora aggiungendo). Le eccezioni non sono state sollevate da paramiko, ma da 'sottoprocesso' o 'os' ecc. Quando qualcosa è andato storto altrove. Immagino che potrei mettere un 'client.close()' in ogni eccezione ma non è molto carina. – Ben

+2

Se metti le chiamate a 'sottoprocesso' o' os' all'interno del blocco 'try', il blocco' finally' verrà sempre chiamato indipendentemente da cosa abbia generato l'eccezione. Se vuoi che sia un po 'più carino allora potresti voler avvolgere il client in un 'Gestore del contesto' e usare l'istruzione' with'. http://docs.python.org/reference/datamodel.html#context-managers – aculich

+0

Quel signore è un punto così +1! Non risponde alla domanda e non ha molto senso mettere ogni singola cosa in un blocco 'try ... finally' se tutti gli ultimi sono uguali. Ma non c'è niente di sbagliato nel mettere la chiamata alla classe in una, quindi la chiudo sempre in modo pulito. – Ben

3

SSHClient() può essere utilizzato come un contesto manager, in modo da poter fare

with SSHClient() as ssh: 
    ssh.connect(...) 
    ssh.exec_command(...) 

e non chiudere manualmente.

Problemi correlati