如何修复pysftp间歇性'[Errno 2] No such file'?

时间:2019-01-23 17:34:59

标签: python pysftp

我正在使用Python中的pysftp模块将文件上传到远程sftp服务器。大约25%的时间无法上传文件,并且我收到错误消息:“ [Errno 2]没有这样的文件。”

我仅用用户名和密码连接到远程sftp服务器。没有使用SSH密钥。建立连接后,我传递了一个cnopts()实例,其主机密钥设置为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)

输入代码(uploadFile函数)

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()

由于本地和远程文件路径正确,并且随后的循环可以很好地上传以前失败的文件,所以我希望所有文件在第一次尝试时都能成功上传。

2 个答案:

答案 0 :(得分:0)

在这种特殊情况下,由于在put方法上的输入设置为True,因此出现“ [Errno 2] No such file。”错误。上载后,文件很快从目标文件夹中删除,确认过程无法完成。然后它将返回“ [Errno 2] No such file”。错误。该问题是间歇性的,因为大约有50%的时间,文件在目标目录中的停留时间足够长,以致于确认可以成功完成。将确认布尔值设置为False可以解决此问题。

答案 1 :(得分:0)

这里很好。正在拉我的头发,但事实证明,在帖子那一边,他们正在快速处理文件并删除它。这导致了错误。

head, tail = os.path.split(filename)
    with pysftp.Connection('hotname', username='uname', password='pass',
                           cnopts=cnopts) as sftp:
        with sftp.cd('/mydir/subdir/'):  
            sftp.put(filename,tail,confirm=False)