Как исправить pysftp прерывистый '[Errno 2] Нет такого файла'? - PullRequest
0 голосов
/ 23 января 2019

Я загружаю файлы на удаленный сервер sftp с помощью модуля pysftp в Python.Примерно в 25% случаев файл не загружается, и я получаю сообщение об ошибке: «[Errno 2] Нет такого файла».

Я подключаюсь к удаленному серверу sftp, используя просто имя пользователя и пароль.Ключ SSH не используется.После установления соединения я передаю экземпляр cnopts () с hostkeys, установленным в None, поскольку ключи SSH не используются.Затем я перебираю каждый файл и выполняю put (), чтобы загрузить каждый файл на сервер sftp.Первые два файла обычно загружаются успешно, но затем по третьему или четвертому файлу я обычно получаю ошибку [Errno 2].Если я перезапущу скрипт для того же файла, который только что вышел из строя, он загрузится просто отлично.Поэтому, похоже, что это не проблема локального или удаленного пути, поскольку при первом запуске ко второму все совпадает.

Код подключения

elif self.ctype == 'sftp':
    if self.pkpath == None:
        #set pysftp to not check for ssh key, only use password
        cnopts = pysftp.CnOpts()
        cnopts.hostkeys = None
        #connecting to sftp server
        self.conn = pysftp.Connection(self.address, self.user, password=self.password,
                cnopts=cnopts)
    else:
        self.conn = pysftp.Connection(self.address, self.user, password=self.password,
                private_key=self.pkpath)

Положите код (uploadFilefunction)

def uploadFile(self,fileName,fdestname=None):
    ...
    if fdestname is None:
        fattr = self.conn.put(fileName, confirm=True, preserve_mtime=True)
    else:
        fattr = self.conn.put(fileName, fdestname, confirm=True, preserve_mtime=True)

Код зацикливания

elif inputdict['source'] == 'unprocessed': 
    Sftp.uploadFile(os.path.join(inputdict['unprocessedfolder'],vimsf), vimsfm)
    print Sftp.lst()

Поскольку локальные и удаленные пути к файлам правильные, а последующие циклы загружают ранее сбойные файлы просто отлично, я ожидаю, что все файлы будутзагрузить успешно с первой попытки.

1 Ответ

0 голосов
/ 09 марта 2019

В данном конкретном случае ошибка [[Errno 2] No such file. 'обнаруживалась, потому что вход для метода put был установлен в True. Файлы были удалены из папки назначения так быстро после загрузки, что процесс подтверждения не может быть завершен. Затем он возвращает «[Errno 2] Нет такого файла». ошибка. Проблема была периодической, так как примерно в 50% случаев файлы оставались в каталоге назначения достаточно долго, чтобы подтверждение могло успешно завершиться. Установка подтверждения bool в False решила проблему.

...