我正在使用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()
由于本地和远程文件路径正确,并且随后的循环可以很好地上传以前失败的文件,所以我希望所有文件在第一次尝试时都能成功上传。
答案 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)