#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. Это прекрасно работает с небольшими изменениями: Спасибо.