2009-05-12 14 views
12

पैरामीको का SFTPClient का उपयोग कर एक पथ मौजूद है या नहीं, जाहिर है कि exists विधि नहीं है। यह मेरा वर्तमान कार्यान्वयन है:जांचें कि एक दूरस्थ होस्ट पर पैरामीको

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

यह शायद एक गैर पर करने के लिए क्योंकि स्टेट() सही तरीका है पैरामीको के माध्यम से एक एसएफटीपी सर्वर पर मौजूदा फ़ाइल errno.ENOENT त्रुटि कोड के साथ इस विशेष अपवाद को बढ़ाएगी: https://github.com/paramiko/paramiko/blob/master/paramiko/sftp_client.py#L722 – Devy

7

एसएफटीपी (केवल पैरामीको नहीं) के लिए परिभाषित कोई "मौजूद" विधि नहीं है, इसलिए आपकी विधि ठीक है।

मुझे लगता है कि errno जाँच एक छोटे से क्लीनर है:

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 
संबंधित मुद्दे