PySFTP и get_r с использованием Python - «Нет такого файла или каталога» - PullRequest
0 голосов
/ 13 сентября 2018

Итак, у меня есть «простой» процесс, который должен выйти и получить данные с другого сервера, а затем скопировать каталог (и все подкаталоги) на мой сервер

Код выглядит следующим образом:

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 голосов
/ 13 сентября 2018

Я считаю, что целевой каталог get_r (localdir аргумент) должен существовать. pysftp не создаст его для вас.

Пока ваш вызов shutil.rmtree удаляет не только содержимое каталога, но и сам каталог.

Создайте каталог позже:

shutil.rmtree(dbfs_path)  
os.mkdir(dbfs_path)

Хотя на самом деле я не понимаю твою первоначальную проблему. Я не понимаю, почему вы получаете сообщение об ошибке "каталог уже существует" . Возможно, вам следует спросить об этой проблеме, а не применять неэффективный обходной путь.

...