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

AWS Lambda Python的FileNotFoundError问题:本地与Lambda路径差异

解决本地Windows与AWS Lambda的S3文件路径兼容问题

我之前也踩过这个跨环境路径的坑,太懂这种本地跑正常、部署到Lambda就报错的憋屈感了!咱们一步步来解决:

问题根源拆解

  1. 临时文件路径差异:Windows本地用os.path.join('tmp', file_name)生成的是tmp\filename(相对当前目录的tmp文件夹),而Lambda运行在Linux环境,它的临时目录是绝对路径/tmp,相对路径的tmp在Lambda里会找不到。
  2. S3对象键的前导斜杠问题:S3的对象键本质上没有“根目录”的概念,前导斜杠/会被当作键的一部分。本地能识别不带前导斜杠的键(比如folder/file.txt),但如果Lambda环境中传入的键带了前导斜杠(比如/folder/file.txt),就会匹配不到正确的S3对象,反过来也一样。

兼容双环境的解决方案

1. 统一临时文件路径处理

放弃手动写tmp,改用跨平台的临时目录获取方式,不管是Windows还是Lambda都能自动适配:

import tempfile
import os

# 获取当前环境的默认临时目录
temp_dir = tempfile.gettempdir()
# 生成正确的临时文件路径
new_file_path = os.path.join(temp_dir, file_name)
  • Windows下,tempfile.gettempdir()会返回系统临时目录(比如C:\Users\你的用户名\AppData\Local\Temp)
  • Lambda下,它会自动指向/tmp目录,完美适配。

如果你坚持要在本地用当前目录下的tmp文件夹,也可以加个环境判断:

def is_lambda_env():
    # 通过环境变量判断是否在Lambda中运行
    return os.environ.get('AWS_EXECUTION_ENV') is not None

if is_lambda_env():
    temp_dir = '/tmp'
else:
    temp_dir = 'tmp'
    # 确保本地tmp文件夹存在,避免创建失败
    os.makedirs(temp_dir, exist_ok=True)

new_file_path = os.path.join(temp_dir, file_name)

2. 标准化S3对象键

不管传入的file_key带不带前导斜杠,都统一处理成S3能识别的格式:

# 移除所有前导斜杠,确保键格式正确
normalized_file_key = file_key.lstrip('/')

这样不管本地测试时用的是folder/file.txt,还是Lambda触发时传入的/folder/file.txt,都会被转换成正确的对象键,避免找不到文件的问题。

完整兼容代码

把上面的逻辑整合起来,就是能在双环境正常运行的代码:

import boto3
import os
import tempfile

def download_s3_file(file_key, file_name):
    # 标准化S3对象键,移除多余前导斜杠
    normalized_file_key = file_key.lstrip('/')
    
    # 获取跨环境兼容的临时目录
    temp_dir = tempfile.gettempdir()
    new_file_path = os.path.join(temp_dir, file_name)
    
    # 初始化S3资源并下载文件
    s3 = boto3.resource('s3')
    s3.Bucket('bucketname').download_file(normalized_file_key, new_file_path)
    
    return new_file_path

额外提醒

  • 永远不要依赖S3对象键的前导斜杠!S3不是文件系统,/folder/file.txt和folder/file.txt是两个完全不同的对象键。
  • Lambda的/tmp目录有空间限制(目前是10GB),下载大文件时要注意容量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:11:41