使用Python的PySFTP和get_r-“无此文件或目录”

时间:2018-09-13 01:23:01

标签: python sftp pysftp

因此,我有一个“简单”过程,需要执行该过程,然后从另一台服务器中获取数据,然后将目录(以及所有子目录)复制到我的服务器中

代码如下:

import pysftp


dbfs_path = '/dbfs/mnt/aaa/bbb/output/{}/'.format(dbutils.widgets.get("run_name"))
remote_path = '/mst_bbb/{}/output/{}/'.format(bucket,dbutils.widgets.get("run_name"))
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None   

srv = pysftp.Connection(host=host_name, username="xxx",password="yyy",cnopts=cnopts)

srv.get_r(remote_path,dbfs_path)

一切正常,直到我意识到有时我不得不多次获取相同的目录并抛出错误

  

该目录已存在

没问题,我想并做了以下事情:

import shutil
shutil.rmtree(dbfs_path)

然后重新运行代码

但是现在我得到了一个完全不同的错误

---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-16-9f782d79e03f> in <module>()
     12 
     13 srv = pysftp.Connection(host=host_name, username="xxx",password="yyy",cnopts=cnopts)
---> 14 srv.get_r(remote_path,dbfs_path)

/databricks/python/local/lib/python2.7/site-packages/pysftp/__init__.pyc in get_r(self, remotedir, localdir, preserve_mtime)
    309             self.get(fname,
    310                      reparent(localdir, fname),
--> 311                      preserve_mtime=preserve_mtime)
    312 
    313     def getfo(self, remotepath, flo, callback=None):

/databricks/python/local/lib/python2.7/site-packages/pysftp/__init__.pyc in get(self, remotepath, localpath, callback, preserve_mtime)
    247             sftpattrs = self._sftp.stat(remotepath)
    248 
--> 249         self._sftp.get(remotepath, localpath, callback=callback)
    250         if preserve_mtime:
    251             os.utime(localpath, (sftpattrs.st_atime, sftpattrs.st_mtime))

/databricks/python/local/lib/python2.7/site-packages/paramiko/sftp_client.pyc in get(self, remotepath, localpath, callback)
    767             Added the ``callback`` param
    768         """
--> 769         with open(localpath, 'wb') as fl:
    770             size = self.getfo(remotepath, fl, callback)
    771         s = os.stat(localpath)

IOError: [Errno 2] No such file or directory: u'/dbfs/aaa/bbb/output/run_job/./mst_bbb/pri1/output/run_job/date=2017-12-01/2017-12-01_output_0.csv.gz'

任何想法都可能导致此问题?我不明白

谢谢

1 个答案:

答案 0 :(得分:0)

我认为component.setHeight("33%")get_r参数)的目标目录必须存在。 pysftp不会为您创建它。

调用localdir时不仅会删除目录内容,还会删除目录本身。

之后重新创建目录:

shutil.rmtree

尽管实际上,我不理解您的原始问题。我看不到为什么会出现“目录已存在” 错误。也许您应该问这个问题,而不是实施效率低下的解决方法。