virtualenv是什么?如何借助它处理AWS Lambda函数的包依赖?Python项目迁移至Python3.9并部署到AWS Lambda的依赖部署疑问
一、关于virtualenv的基础问题
1. virtualenv是什么?
virtualenv是Python生态里的虚拟环境管理工具,核心作用是给每个项目创建一个独立的Python运行环境——这个环境和你的系统全局Python环境完全隔离,里面安装的依赖包、Python版本都不会互相干扰。比如你同时维护Python2和Python3项目,用virtualenv就能避免依赖版本冲突的头疼问题。
2. 它如何帮助处理AWS Lambda的包依赖?
Lambda是无服务器运行环境,本身只提供指定版本的Python标准库和部分官方SDK(比如Python3.9运行时自带boto3)。如果你本地开发的项目依赖第三方包,直接上传代码肯定跑不起来。
virtualenv的价值在这里就体现了:
- 你可以在本地创建一个和Lambda运行时版本匹配的虚拟环境(比如Python3.9),然后在这个环境里安装项目需要的所有依赖;
- 之后把虚拟环境里
site-packages目录下的依赖文件,和你的项目代码一起打包成Zip包上传到Lambda,就能保证Lambda运行时能找到正确的依赖,避免环境不兼容的问题。
二、Python2.7到3.9的Lambda迁移方案
你的情况比较明确:原项目用Python2.7+virtualenv打包,现在要迁移到Python3.9,还要处理boto3、botocore、pypdftk这几个依赖。我给你梳理清晰的步骤和选项:
先明确Lambda的核心规则
首先划重点:Python3.9版本的Lambda运行时已经自带了boto3和botocore,而且版本是和Lambda运行时兼容的官方版本。所以这两个依赖你完全不用自己打包,也不需要上传到Layers——直接在代码里正常导入就行,Lambda会自动找到它们。
真正需要处理的是pypdftk,因为这个库依赖系统级的pdftk二进制工具,而Lambda的Amazon Linux 2运行时默认没有这个工具。
两种依赖处理方案(二选一即可)
方案1:用Lambda Layers管理pypdftk(推荐)
Layers是Lambda用来扩展运行时的功能,适合复用依赖或者分离系统级工具。步骤如下:
- 准备一个Amazon Linux 2环境(可以用EC2实例,或者本地用Docker跑
amazonlinux:2镜像),因为Lambda的运行环境是Amazon Linux 2,只有在这里编译/安装的pdftk才能在Lambda里正常运行; - 在这个环境里创建Layer的目录结构:
mkdir -p my-pdftk-layer/python/lib/python3.9/site-packages mkdir my-pdftk-layer/bin - 安装pypdftk到指定目录:
pip3 install pypdftk -t my-pdftk-layer/python/lib/python3.9/site-packages - 下载或编译兼容Amazon Linux 2的
pdftk二进制文件,放到my-pdftk-layer/bin目录下; - 进入
my-pdftk-layer目录,把所有内容打包成Zip:zip -r pdftk-layer.zip . - 把这个Zip包上传到Lambda Layers,然后在你的Lambda函数配置里关联这个Layer;
- 最后只需要把你的Python3.9项目代码打包成Zip上传到Lambda即可——代码里正常导入pypdftk就行,Layer会自动提供依赖和系统工具。
方案2:直接和代码一起打包(适合小型项目)
如果不想用Layers,也可以把pypdftk和pdftk二进制文件和代码打包在一起:
- 在本地Python3.9环境(可以用virtualenv创建)里安装pypdftk:
pip install pypdftk -t ./my-project - 把兼容Amazon Linux 2的
pdftk二进制文件放到项目目录的bin子目录; - 在你的Python代码里指定pdftk的路径,比如:
import pypdftk pypdftk.set_pdftk_path('./bin/pdftk') - 把整个项目目录(代码+pypdftk文件+bin目录)打包成Zip,上传到Lambda即可。
关于virtualenv的使用注意
现在迁移到Python3.9,不需要像Python2.7那样打包整个virtualenv环境——因为Lambda已经提供了Python3.9的解释器,你不需要自己携带解释器。virtualenv现在的作用只是帮你在本地创建干净的Python3.9环境,安装依赖后,只需要把依赖文件(而不是整个virtualenv)和代码打包就行。
最后一步:代码迁移验证
别忘了先把原Python2.7的代码改成Python3.9兼容的语法:比如把print "xxx"改成print("xxx"),处理编码问题,调整字典迭代、字符串格式化等Python2和Python3的差异,确保代码在本地Python3.9环境能正常运行后再打包上传。
内容的提问来源于stack exchange,提问作者Stephen Stilwell

