如何在Poetry构建的Python包中嵌入ffprobe适配AWS Lambda
在Poetry构建的Python包中嵌入ffprobe二进制(适配AWS Lambda)
1. 调整项目目录结构
把对应Lambda架构的ffprobe二进制文件放到你的Python包目录下,建议建个bin子文件夹区分平台:
your-package/ ├── your_package/ │ ├── __init__.py │ ├── bin/ │ │ └── linux-x86_64/ │ │ └── ffprobe # 存放x86_64架构的ffprobe二进制 │ │ └── ffprobe-arm64 # 若需支持arm64架构,单独存放对应二进制 │ └── your_code.py └── pyproject.toml
注意:必须使用针对Lambda运行环境(Amazon Linux 2/2023)编译的二进制,不能直接用本地环境的文件。
2. 配置Poetry打包二进制文件
在pyproject.toml中添加配置,明确告诉Poetry要把这些二进制文件打包进wheel:
[tool.poetry] name = "your-package" # 保留你原有的其他配置 [tool.poetry.packages] include = [ { path = "your_package", format = "wheel" }, { path = "your_package/bin/linux-x86_64/ffprobe", format = "wheel" }, { path = "your_package/bin/linux-x86_64/ffprobe-arm64", format = "wheel" } # 支持arm64时添加 ] # 兼容setuptools的配置(可选,适配部分旧构建流程) [tool.setuptools.package-data] your_package = ["bin/**/*"]
Poetry 1.8+版本中,packages.include配置已足够完成二进制文件的打包,setuptools.package-data可按需添加。
3. 在代码中调用嵌入的ffprobe
通过Python标准库获取包内二进制路径,并确保执行权限(Lambda环境默认可能没有):
import os import importlib.resources import subprocess import platform def get_ffprobe_path(): # 根据Lambda架构自动匹配二进制 arch = platform.machine() bin_name = "ffprobe-arm64" if arch == "aarch64" else "ffprobe" # 获取包内二进制文件的绝对路径 with importlib.resources.path("your_package.bin.linux-x86_64", bin_name) as path: os.chmod(path, 0o755) # 添加执行权限 return str(path) # 调用示例 ffprobe_path = get_ffprobe_path() version_output = subprocess.run([ffprobe_path, "-version"], capture_output=True, text=True) print(version_output.stdout)
4. 验证wheel包内容
构建wheel后解压检查,确认二进制文件已被正确打包:
poetry build --format wheel unzip dist/your_package-*.whl -d temp_wheel ls temp_wheel/your_package/bin/linux-x86_64/
若能看到ffprobe相关文件,说明打包成功。
5. Lambda容器镜像适配
如果使用容器Lambda,确保基础镜像与Lambda兼容,安装包时直接使用pip install your_package.whl,二进制文件会被正确安装到site-packages下的你的包目录中。
内容的提问来源于stack exchange,提问作者BlueMagma
相关产品推荐
相关产品推荐

