1 回答

TA贡献1784条经验 获得超8个赞
我无法重现您的确切问题,但确实已知 pysftp 的递归函数的实现方式使它们在 Windows(或任何不使用 *nix-like 路径语法的系统)上失败。
Pysftp 对远程 SFTP 路径的使用os.sep和os.path功能,有什么问题,因为 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)
请注意,上面的代码可以很容易地修改为直接使用 Paramiko,以防您不想使用 pysftp。Paramiko类SFTPClient也有该put方法。唯一的区别是 Paramikoput没有preserve_mtime参数/功能(但如果需要,它可以很容易地实现)。
添加回答
举报