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

AWS Lambda出现只读文件系统错误,关联NLTK下载问题如何解决?

AWS Lambda 中 NLTK 只读文件系统错误的解决办法

从错误栈跟踪能明确问题:你的代码调用nltk.download('stopwords')时,NLTK默认尝试在/home/sbx_user1051目录创建文件夹存储数据,但AWS Lambda运行环境中,除了/tmp目录以外的所有路径都是只读的,因此触发了OSError: [Errno 30] Read-only file system。

下面是几种可行的解决办法:

方法一:构建Docker镜像时预先下载NLTK数据(推荐)

如果用Docker镜像部署Lambda,直接在Dockerfile中提前下载所需的NLTK数据,避免运行时的写入操作。示例Dockerfile:

FROM public.ecr.aws/lambda/python:3.8

# 安装nltk依赖
RUN pip install nltk

# 提前下载stopwords到Lambda任务目录下的nltk_data文件夹
RUN python -m nltk.downloader -d /var/task/nltk_data stopwords

# 设置环境变量,让NLTK自动识别数据路径
ENV NLTK_DATA=/var/task/nltk_data

# 复制应用代码到Lambda任务根目录
COPY app.py ${LAMBDA_TASK_ROOT}

# 指定Lambda函数入口
CMD ["app.lambda_handler"]

修改后,你的app.py里可以删除nltk.download('stopwords')这行代码,直接导入使用即可。

方法二:运行时指定下载到/tmp目录

如果不想修改镜像,可调整代码,让NLTK将数据下载到Lambda唯一可写的/tmp目录:

import nltk

# 指定下载目录为/tmp
nltk.download('stopwords', download_dir='/tmp')
# 添加数据路径到NLTK的搜索路径
nltk.data.path.append('/tmp')

# 正常使用stopwords
from nltk.corpus import stopwords
stop_words = set(stopwords.words('english'))

注意:这种方法会在Lambda冷启动时重复下载数据,可能增加启动延迟,适合临时调试或小体量场景。

方法三:打包代码时包含NLTK数据

若不用Docker镜像,采用zip包部署,可提前在本地下载stopwords数据,将nltk_data文件夹与代码一起打包,然后在代码中指定路径:

import nltk
import os

# 添加本地打包的nltk_data路径
nltk.data.path.append(os.path.join(os.path.dirname(__file__), 'nltk_data'))

# 直接使用stopwords
from nltk.corpus import stopwords
stop_words = set(stopwords.words('english'))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 00:45:36