Python pysftp put_r не работает на Windows - PullRequest
1 голос
/ 19 октября 2019

Я хотел бы загрузить несколько файлов из каталога Windows на SFTP-сервер, используя pysftp 0.2.8. Я прочитал документ, и он предлагает использовать put_d или put_r, но оба дают мне следующую ошибку:

OSError: Неверный путь:

sftp_local_path = r'C:\Users\Swiss\some\path'

sftp_remote_path = '/FTP/LPS Data/ATC/RAND/20191019_RAND/XML'

with pysftp.Connection("xxx.xxx.xxx.xxx", username=myUsername, password=myPassword) as sftp:
    with sftp.cd(sftp_remote_path):
        sftp.put_r(sftp_local_path, sftp_remote_path)
        for i in sftp.listdir():
            lstatout=str(sftp.lstat(i)).split()[0]
            if 'd' in lstatout: print (i, 'is a directory')

sftp.close()

Я хотел бы иметь возможность копировать все файлы или выбранные файлы из моего локального каталога на SFTP-сервер.

1 Ответ

1 голос
/ 19 октября 2019

Я не могу воспроизвести вашу точную проблему, но на самом деле рекурсивные функции pysftp, как известно, реализованы таким образом, что они вызывают сбой в Windows (или любой системе, которая не использует * nix-подобный синтаксис пути).

Он использует функции os.sep и os.path для удаленных путей SFTP, что не так, поскольку пути SFTP всегда используют прямую косую черту.


Но вы можете легко реализовать переносимую замену:

import os
def put_r_portable(sftp, localdir, remotedir, preserve_mtime=False):
    for entry in os.listdir(localdir):
        remotepath = remotedir + "/" + entry
        localpath = os.path.join(localdir, entry)
        if not os.path.isfile(localpath):
            try:
                sftp.mkdir(remotepath)
            except OSError:     
                pass
            put_r_portable(sftp, localpath, remotepath, preserve_mtime)
        else:
            sftp.put(localpath, remotepath, preserve_mtime=preserve_mtime)    

Используйте это как:

put_r_portable(sftp, sftp_local_path, sftp_remote_path, preserve_mtime=False) 

Подобный вопрос о get_r см.
Python pysftp get_rиз Linux отлично работает на Linux, но не на Windows

...