pysftp.Соединение.функция walktree() завершается ошибкой, если в каком-либо каталоге нет разрешения на чтение

#python #sftp #paramiko #pysftp

Вопрос:

Я использую соединение pysftp, используя walktree() метод для перечисления всех файлов, как показано ниже

 with pysftp.Connection(domain, username=USER,
                       password=PWD, port=port,
                       cnopts=cnopts) as sftp:

    # call back method to list the files for the directory found in walktree
    def dir_found_list_files(path):
        if path:
            files = sftp.listdir_attr(path)
            for file in files:
                if 'r' in file.longname[:4]:
                    filelist.append(path '/' file.filename)

    # call back method when file found in walktree
    def file_found(path):
        pass

    # call back method when unknown found in walktree
    def unknown_file(path):
        pass

    # sftp walk tree to list files
    sftp.walktree("/", file_found, dir_found_list_files, unknown_file, recurse=True)
 

Эта часть работает нормально. Но когда у какой-либо папки нет разрешения на чтение, walktree метод вызывает исключение разрешения.
Как я могу игнорировать папку «Доступ запрещен» и продолжить walktree поиск доступных папок?

Ответ №1:

Ты не можешь. Приложение Connection.walktree не допускает такой настройки.

Но метод довольно тривиальный, проверьте его исходный код. Просто скопируйте код и настройте его так, как вам нужно. Что-то вроде этого (непроверено):

 def robust_walktree(sftp, remotepath, fcallback, dcallback, ucallback, recurse=True)
    try:
        entries = sftp.listdir(remotepath)
    except IOError as e:
        if e.errno != errno.EACCES:
            raise
        else
            entries = []

    for entry in entries:
        pathname = posixpath.join(remotepath, entry)
        mode = sftp.stat(pathname).st_mode
        if S_ISDIR(mode):
            # It's a directory, call the dcallback function
            dcallback(pathname)
            if recurse:
                # now, recurse into it
                robust_walktree(sftp, pathname, fcallback, dcallback, ucallback)
        elif S_ISREG(mode):
            # It's a file, call the fcallback function
            fcallback(pathname)
        else:
            # Unknown file type
            ucallback(pathname)
 

Комментарии:

1. Это прекрасно работает с небольшими изменениями: Спасибо.