如何编写Python脚本打包指定依赖为zip文件用作AWS Lambda层
实现Python打包指定依赖为AWS Lambda层zip的方案
注意:AWS Lambda层要求依赖必须放在python目录下,zip解压后要能直接看到python/[site-packages内容],否则Lambda运行时会找不到依赖
核心函数实现
以下代码直接实现了你需要的create_zip、add_to_zip逻辑,额外补充了收尾清理的方法:
import os import sys import zipfile import tempfile import subprocess from pathlib import Path # 全局状态存储 _zip_file = None _temp_dir = None def create_zip(zip_output_path: str = "lambda_layer.zip"): global _zip_file, _temp_dir # 初始化临时目录,生成Lambda层要求的python目录结构 _temp_dir = tempfile.TemporaryDirectory() python_dir = Path(_temp_dir.name) / "python" python_dir.mkdir(exist_ok=True) # 初始化zip文件对象,使用压缩模式减少体积 _zip_file = zipfile.ZipFile(zip_output_path, "w", zipfile.ZIP_DEFLATED) def add_to_zip(package_name: str): global _zip_file, _temp_dir if not _zip_file or not _temp_dir: raise RuntimeError("请先调用create_zip()完成初始化") python_dir = Path(_temp_dir.name) / "python" # 调用pip安装指定依赖到临时目录 subprocess.check_call( [sys.executable, "-m", "pip", "install", package_name, "-t", str(python_dir), "--no-cache-dir"], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT ) # 遍历安装好的文件写入zip,保留Lambda要求的相对路径 for root, dirs, files in os.walk(python_dir): for file in files: file_path = Path(root) / file relative_path = file_path.relative_to(Path(_temp_dir.name)) _zip_file.write(file_path, relative_path) def finalize_zip(): """打包完成后调用,关闭zip文件、清理临时文件""" global _zip_file, _temp_dir if _zip_file: _zip_file.close() if _temp_dir: _temp_dir.cleanup()
使用示例
和你给出的调用逻辑完全对齐:
if __name__ == "__main__": create_zip("my_lambda_layer.zip") # 注意:glob、json、logging都是Python标准库,Lambda运行环境自带,不需要打包 for pkg in ['pandas', 'requests']: add_to_zip(pkg) finalize_zip()
注意事项
- 如果需要打包兼容特定Lambda运行环境的依赖,比如Python3.9、x86_64架构,可以在
pip install的参数里追加--platform manylinux2014_x86_64 --python-version 3.9 --only-binary :all:,替换为你实际使用的运行时版本和架构即可 - Lambda层解压后的总大小不能超过250MB,注意控制依赖数量
- 标准库不需要打包,会额外占用zip体积
内容的提问来源于stack exchange,提问作者Rafa
相关产品推荐
相关产品推荐

