2011-08-23 17 views
9

私はいくつかのコードをデバッグしています。これにより、私は常にいくつかの外部sftpサーバーにログイン/ログアウトしてしまいます。非paramiko例外がコード内で発生した場合、paramikoが外部サーバー上のssh/sftpセッションを自動的に閉じるかどうかは誰にも分かりますか?私はドキュメントでそれを見つけることができないし、各反復で接続がかなり早く行われなければならないので、私は20のオープンな接続で終わりたくない。paramikoはnon-paramiko例外でssh接続を閉じますか

答えて

15

いいえ、paramikoは自動的にssh/sftpセッションを終了しません。 paramikoコードなどで例外が生成されたかどうかは関係ありません。 paramikoコードには例外をキャッチして自動的に閉じてしまうので、あなた自身で行う必要はありません。

あなたは最終的にはそうのようなブロック/試しにそれをラップすることにより、それが閉じられますことを確認することができます。

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

ありがとうございました。問題は、数千行のコードをデバッグしていたことです(さらに、それに追加しています)。例外はparamikoによって引き起こされず、何かがどこかに間違っていたときに 'subprocess'や' os'などで言います。私は、すべての例外に 'client.close()'を置くことができたと思いますが、それほど美しいものではありません。 – Ben

+2

'try'ブロックの中に' subprocess'または 'os'の呼び出しを置くと、例外を生成したものに関係なく' finally'ブロックが常に呼び出されます。それがちょっときれいだったら、 'Context Manager'でクライアントをラップし、' with'ステートメントを使いたいかもしれません。 http://docs.python.org/reference/datamodel.html#context-managers – aculich

+0

その先生は+1のような点です!質問に答えず、最終的にすべてが同じであれば、個々のものを 'try ... finally'ブロックに置くという小さな点はありません。しかし、私はいつもきれいにそれを閉じるので、クラスの呼び出しを1つの中に入れて間違って何もないです。 – Ben

3

SSHClientを()コンテキストマネージャとして使用することができ、あなたが

with SSHClient() as ssh: 
    ssh.connect(...) 
    ssh.exec_command(...) 
を行うことができますので、

手動で閉じる必要はありません。