You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Paramiko/pysftp向Lambda传文件触发IsADirectoryError求助

错误原因分析及解决方案

核心错误原因

pysftp的get方法不允许localpath参数直接指定目录,它要求传入具体的目标文件名而非目录路径。你当前把localpath设为/temp/upload(云监控日志显示实际是/tmp/upload,属于代码笔误),这是一个目录,因此触发IsADirectoryError。

远程路径报错的可能原因:

  • filesList中包含了目录名称而非文件名,导致拼接后的远程路径指向目录
  • 手动拼接路径时出错(比如ftp_filepath结尾无斜杠,导致路径变成/home/mmoradi2/datafile.txt这类错误格式)

修复步骤

1. 修正本地路径参数

调用get时必须指定具体文件名,将本地目录与文件名拼接:

import os
import pysftp

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
# Lambda临时目录为/tmp,修正代码中的路径笔误
local_base_dir = '/tmp/upload/'
# 确保本地目录存在,Lambda的/tmp目录可写,但需提前创建
os.makedirs(local_base_dir, exist_ok=True)

with pysftp.Connection(host=host, username=user, password=password, port=22, cnopts=cnopts) as sftp:
    sftp.chdir(ftp_filepath)              
    for file in filesList:
        # 用os.path.join安全拼接路径,避免手动拼接的格式错误
        sftp_remote_path = os.path.join(ftp_filepath, file)
        local_file_path = os.path.join(local_base_dir, file)
        sftp.get(sftp_remote_path, localpath=local_file_path, preserve_mtime=True)

2. 确保远程路径指向文件

  • 检查filesList元素是否均为文件名,若需下载整个目录,改用get_d方法:
# 下载整个远程目录到本地目录,注意参数顺序为远程目录在前、本地目录在后
sftp.get_d(remote_dir=ftp_filepath, local_dir=local_base_dir, preserve_mtime=True)

3. 路径拼接最佳实践

始终用os.path.join拼接路径,避免手动添加斜杠导致的格式错误,适配不同目录结构场景。


内容的提问来源于stack exchange,提问作者user22990221

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:56:12