2011-08-23 21 views
9

Estoy depurando algún código, lo que me va a hacer entrar y salir constantemente de algunos servidores externos de sftp. ¿Alguien sabe si paramiko cierra automáticamente una sesión ssh/sftp en el servidor externo si se genera una excepción que no sea paramiko en el código? No puedo encontrarlo en los documentos y, como las conexiones se tienen que hacer bastante temprano en cada iteración, no quiero terminar con 20 conexiones abiertas.¿Paramiko cierra la conexión ssh en una excepción que no es paramiko?

Respuesta

15

No, paramiko no cerrará automáticamente la sesión ssh/sftp. No importa si la excepción fue generada por el código de paramiko o de otra manera; no hay nada en el código de paramiko que capte ninguna excepción y automáticamente los cierra, por lo que tiene que hacerlo usted mismo.

Puede asegurarse de que se cierra envolviéndolo en un try/finally así:

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

Gracias, el problema fue que estaba depurando unas pocas miles de líneas de código (y aún estoy agregando). Las excepciones no fueron planteadas por paramiko sino por 'subprocess' o' os' etc. cuando algo salió mal en otro lado. Supongo que podría poner un 'client.close()' en cada excepción, pero eso no es muy bonito. – Ben

+2

Si coloca las llamadas a 'subprocess' o' os' dentro del bloque 'try', se llamará siempre al bloque' finally' independientemente de lo que haya generado la excepción. Si quieres que sea un poco más bonita, podrías envolver al cliente en un 'Context Manager' y usar la declaración' with'. http://docs.python.org/reference/datamodel.html#context-managers – aculich

+0

¡Ese señor es un punto tan +1! No responde la pregunta y no tiene sentido poner cada cosa individual en un bloque de "prueba ... finalmente" si todo lo de finalmente es lo mismo. Pero no hay nada de malo en poner la llamada a la clase dentro de una, así que siempre la cierro limpiamente. – Ben

3

SSHClient() se puede utilizar como un gestor de contexto, lo que puede hacer

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

y no se cierra manualmente.

Cuestiones relacionadas