2009-05-12 13 views
12

ParamikoのSFTPClientを使用してリモートホスト上にパスが存在するかどうかを確認するには、明らかにexistsメソッドがありません。これは私の現在の実装です:paramiko

def rexists(sftp, path): 
    """os.path.exists for paramiko's SCP object 
    """ 
    try: 
     sftp.stat(path) 
    except IOError, e: 
     if 'No such file' in str(e): 
      return False 
     raise 
    else: 
     return True 

もっと良い方法がありますか?例外メッセージの部分文字列をチェックするのはかなり醜いので、信頼できない場合があります。

答えて

18

は、これらすべてのエラーコードを定義する定数のerrno moduleを参照してください:

私はエラー番号をチェックすることはほとんどきれいだと思います。また、__init__引数の拡大よりも、例外のerrno属性を使用するように少し明確ですので、私はこれを行うだろう:

except IOError, e: # or "as" if you're using Python 3.0 
    if e.errno == errno.ENOENT: 
    ... 
+0

これはおそらく行うには正しい方法ですので、STAT()以外にParamikoを介してSFTPサーバー上の既存のファイルは、この特定の例外をerrno.ENOENTエラーコードで発生させます:https://github.com/paramiko/paramiko/blob/master/paramiko/sftp_client.py#L722 – Devy

7

SFTP(paramikoだけではない)用に定義された "exists"メソッドがないため、メソッドは正常です。

def rexists(sftp, path): 
    """os.path.exists for paramiko's SCP object 
    """ 
    try: 
     sftp.stat(path) 
    except IOError, e: 
     if e[0] == 2: 
      return False 
     raise 
    else: 
     return True