最近在部署 FastAPI 后端的时候,踩了小坑。
系统是用 Docker 跑的,基础镜像选的是 python:3.11-slim,想着 slim 版干净轻量、打包也快。
结果上线之后,用户一上传 SHP 文件就直接报错,一串长长的 Traceback,把我整懵了。

错误核心信息是这样的:

ImportError: the 'read_file' function requires the 'fiona' package, but it is not installed or does not import correctly. 
Importing fiona resulted in: libexpat.so.1: cannot open shared object file: No such file or directory

当时我还以为是 fiona 没装好,于是各种 pip install --force-reinstall fiona,结果根本没用。
容器重启、重新构建,照样报一样的错。


后来冷静下来仔细看报错信息,关键在最后一句:

“libexpat.so.1: cannot open shared object file: No such file or directory”

原来这不是 Python 层的问题,而是系统层的动态库缺失。
fiona 这个库在底层其实是用 C 写的,依赖一些系统级的 GIS 库如 GDAL、Expat 之类的。
libexpat.so.1 就是个 XML 解析的动态库文件,而 python:slim 版本默认是极度精简的,很多基础库都没带上。

也就是说——
不是 fiona 没装,而是它装上了,却“用不起来”。

明白原因后,解决就特别简单了。
只要在 Dockerfile 里加上安装系统依赖的命令,装上缺的库就行:

RUN apt-get update && \ apt-get install -y --no-install-recommends libexpat1 gdal-bin libgdal-dev && \ rm -rf /var/lib/apt/lists/*

libexpat1 就是报错缺的库,
gdal-binlibgdal-dev 是 Fiona、GeoPandas 读写 SHP 文件的底层支持。

然后重新 build 一下镜像,启动服务,再传 SHP 文件,完美解决。
日志干干净净,地图数据直接解析出来,舒服!


这事让我彻底长了记性:
以后再用 python:slim 或类似的轻量镜像,一定要记得——
Python 装完包不代表能用,有些包还要系统级的 C 库配合。

尤其是像 GeoPandas、Fiona、Shapely 这种跟 GIS、空间分析沾边的库,底层全是 C 语言和 GDAL,那些库如果没装上,pip 装一万次都没用。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐