2009-05-12 29 views
12

Thông số SFTPClient của Paramiko dường như không có phương thức exists. Đây là triển khai hiện tại của tôi:Kiểm tra xem đường dẫn có tồn tại trên máy chủ từ xa hay không bằng cách sử dụng 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 

Có cách nào tốt hơn để thực hiện việc này không? Việc kiểm tra chuỗi con trong các thông báo Ngoại lệ là khá xấu và có thể không đáng tin cậy.

Trả lời

18

Xem errno module cho hằng số xác định tất cả những mã lỗi. Ngoài ra, đó là một chút rõ ràng hơn để sử dụng errno thuộc tính của ngoại lệ so với việc mở rộng __init__ args, vì vậy tôi muốn làm điều này:

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

Đây có lẽ là cách đúng đắn để làm vì stat() trên một tổ chức phi tệp hiện có trên máy chủ SFTP qua Paramiko sẽ tăng ngoại lệ cụ thể này với mã lỗi errno.ENOENT: https://github.com/paramiko/paramiko/blob/master/paramiko/sftp_client.py#L722 – Devy

7

Không có phương thức "tồn tại" được xác định cho SFTP (không chỉ là paramiko), vì vậy phương pháp của bạn là tốt.

Tôi nghĩ rằng kiểm tra errno là một chút bụi:

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 
Các vấn đề liên quan