私はいくつかのコードをデバッグしています。これにより、私は常にいくつかの外部sftpサーバーにログイン/ログアウトしてしまいます。非paramiko例外がコード内で発生した場合、paramikoが外部サーバー上のssh/sftpセッションを自動的に閉じるかどうかは誰にも分かりますか?私はドキュメントでそれを見つけることができないし、各反復で接続がかなり早く行われなければならないので、私は20のオープンな接続で終わりたくない。paramikoはnon-paramiko例外でssh接続を閉じますか
9
A
答えて
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()
3
SSHClientを()コンテキストマネージャとして使用することができ、あなたが
with SSHClient() as ssh:
ssh.connect(...)
ssh.exec_command(...)
を行うことができますので、
手動で閉じる必要はありません。
ありがとうございました。問題は、数千行のコードをデバッグしていたことです(さらに、それに追加しています)。例外はparamikoによって引き起こされず、何かがどこかに間違っていたときに 'subprocess'や' os'などで言います。私は、すべての例外に 'client.close()'を置くことができたと思いますが、それほど美しいものではありません。 – Ben
'try'ブロックの中に' subprocess'または 'os'の呼び出しを置くと、例外を生成したものに関係なく' finally'ブロックが常に呼び出されます。それがちょっときれいだったら、 'Context Manager'でクライアントをラップし、' with'ステートメントを使いたいかもしれません。 http://docs.python.org/reference/datamodel.html#context-managers – aculich
その先生は+1のような点です!質問に答えず、最終的にすべてが同じであれば、個々のものを 'try ... finally'ブロックに置くという小さな点はありません。しかし、私はいつもきれいにそれを閉じるので、クラスの呼び出しを1つの中に入れて間違って何もないです。 – Ben