Vercel部署Flask API:Serverless函数因Scipy超50MB限制求解决方案
解决Vercel部署Flask API时Scipy导致的函数体积超限问题
1. 手动裁剪Scipy包(最直接有效)
Scipy无法通过pip单独安装子模块,但可以在Vercel构建流程中,先安装完整Scipy,再删除非必要模块缩小体积:
- 项目根目录创建
build.sh脚本:
# 先安装所有依赖(包括Scipy) pip install -r requirements.txt # 替换python3.x为你实际使用的Python版本,比如python3.10 SCIPY_PATH="./venv/lib/python3.x/site-packages/scipy" # 删除不需要的Scipy子模块 rm -rf $SCIPY_PATH/{cluster,constants,fft,fftpack,integrate,interpolate,io,linalg,ndimage,odr,optimize,signal,sparse,special,stats} # 删除文档、测试文件进一步缩减体积 rm -rf $SCIPY_PATH/doc $SCIPY_PATH/tests
- 在
vercel.json中配置构建命令,让Vercel执行该脚本:
{ "functions": { "api/index.py": { "runtime": "@vercel/python@3.10" } }, "buildCommand": "./build.sh" }
裁剪后务必本地测试from scipy.spatial import KDTree是否能正常运行,避免误删依赖的底层文件。
2. 使用轻量替代依赖(备选)
如果手动裁剪过于繁琐,可以尝试使用仅实现KDTree功能的轻量库,比如kdtree或pykdtree,这类库体积远小于完整Scipy。不过你可以先完成Scipy裁剪的尝试,再考虑是否切换。
3. Vercel构建排除配置(局限性较大)
Vercel的vercel.json支持通过include/exclude字段指定函数包的文件范围,但对于Python的site-packages依赖,这种方式难以精准过滤Scipy的子模块,因此不推荐作为主要方案。
内容的提问来源于stack exchange,提问作者Akeel Medina
相关产品推荐
相关产品推荐

