在AWS Lambda(Python 2.7)中部署PIL/Pillow库遇模块找不到问题求助
嘿,我太懂在AWS Lambda的Python 2.7环境里折腾Pillow的痛苦了——这个老环境确实坑不少,不过我整理了几个亲测有效的解决办法,帮你搞定这个no module named PIL的问题:
1. 先盯紧你的部署包结构
很多时候找不到模块都是路径不对搞的鬼!Lambda只会从代码根目录(也就是/var/task)和系统标准库路径里加载模块,所以你的ZIP包解压后必须是这样的结构:
lambda_function.py # 你的主函数文件 PIL/ # Pillow的核心库文件夹 Pillow-2.9.0.dist-info/ # 对应的版本信息文件夹
绝对不能把这些文件嵌套在子文件夹里(比如src/lambda_function.py或者lib/PIL),否则Lambda根本找不到它们。
2. 用正确的pip命令安装兼容版本
Python 2.7的Pillow版本不能太新,而且要确保是针对Lambda的Amazon Linux 1环境编译的:
- 如果你本地用的是Amazon Linux 1(和Lambda Python 2.7底层环境一致),直接在代码目录下运行:
选2.9.0是因为这个版本对Python2.7兼容性拉满,完美适配Lambda环境。pip install pillow==2.9.0 -t . - 如果是Windows/Mac本地环境,直接pip安装的库会因为系统架构不同在Lambda上报错,这时候就必须用预编译的适配包,但要找对针对Python2.7 + Amazon Linux的版本。
3. 预编译库的命名适配
你提到重命名的情况,很多预编译包会把库文件夹命名为Pillow而不是PIL,这时候直接把Pillow文件夹重命名为PIL就行——别担心,里面的代码逻辑都是兼容的,重命名后就能被import PIL识别到。
另外要注意:别拿Python3的预编译包凑数,必须选明确标注支持Python2.7的版本,不然肯定会报错。
4. 验证导入路径(必要时手动添加)
有时候Lambda的自动路径配置可能出问题,你可以在代码开头加一段调试代码,看看根目录是否在加载路径里:
import sys print("当前加载路径:", sys.path)
如果/var/task不在列表里,手动加上就行:
import sys sys.path.append('/var/task') from PIL import Image
不过正常情况下Lambda会自动把/var/task加入路径,这一步只是用来排查极端情况。
5. 正确压缩你的部署包
最后一步别踩坑:压缩的时候要进入到包含lambda_function.py和PIL的目录里,直接压缩里面的所有内容,而不是压缩整个父文件夹。比如在Linux/macOS终端里执行:
zip -r lambda_deploy.zip .
这样压缩出来的ZIP包,解压后所有文件都在根目录,Lambda才能正确识别。
内容的提问来源于stack exchange,提问作者Spencer Goff

