在UbuntuDocker容器中编译GDAL源码并启用Python绑定,解决`ModuleNotFoundError:Nomodulenamed'osgeo'`的两种方法:设置`PYTHONPATH`环境变量指向`/usr/local/lib/python3/dist-packages`,或修改`CMAKE_INSTALL_PREFIX`为`/usr`。需预
在 Ubuntu 基础镜像的 Docker 容器中从源码编译 GDAL 时,解决 `ModuleNotFoundError: No module named 'osgeo'` 的关键方法——通过合理配置安装路径或 Python 模块搜索路径。
这次来聊聊在 Docker 里从源码折腾 GDAL 时,一个非常典型又容易让人挠头的问题。你明明在 CMake 配置里开了 -DBUILD_PYTHON_BINDINGS=ON,编译安装一气呵成,可一到运行 gdal2tiles.py 或者 import osgeo,立马给你来一句:
ModuleNotFoundError: No module named 'osgeo'
说实在的,这个问题的根儿其实很简单,就是“找不着路”。GDAL 默认一头扎进 /usr/local 目录,把它的 Python 包丢到了 /usr/local/lib/python3/dist-packages/osgeo/ 里。但问题在于,系统自带的 Python 解释器,尤其是在被“瘦身”过的 Docker 镜像里,默认不去翻 /usr/local 下的 dist-packages 文件夹。所以,Python 压根不知道 osgeo 这哥们儿已经住进去了。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
针对这个情况,有两个在实战中被反复验证过的稳妥方案,下面直接上干货。
这个方法的核心思路就是“指路”。在编译安装完成后,手动告诉 Python 该去哪儿找 osgeo。
RUN cmake -DBUILD_PYTHON_BINDINGS=ON -DCMAKE_BUILD_TYPE=Release ..
RUN cmake --build .
RUN cmake --build . --target install
# 关键步骤:把这个路径加进去,Python 就知道去哪儿找了
ENV PYTHONPATH=/usr/local/lib/python3/dist-packages:$PYTHONPATH
这个方案的好处是不污染系统原有的路径设置,如果同一台机器上需要同时维护多个 Python 版本(比如 python3.8 和 python3.10),这种隔离方式就很清爽。在 CI/CD 这种自动化构建场景中,也是比较推荐的做法。
当然,有两个小细节得留意一下。一是你得确认路径里的 Python 版本号是对的,比如系统里是 python3.8,那路径就得改成 /usr/local/lib/python3.8/dist-packages。二是如果不确定具体路径,可以用一条命令验证一下:python3 -c "import site; print(site.getsitepackages())",看看打印出来的默认搜索路径列表里有没有 /usr/local 相关的部分。
另一个更直截了当的办法,就是让 GDAL 直接安装到 Python 默认会去搜的路径里。把目标前缀改到 /usr 就行了。
# 直接把安装目标指向 /usr,这样 osgeo 就会自动落在系统默认的 site-packages 里
RUN cmake -DBUILD_PYTHON_BINDINGS=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr ..
RUN cmake --build .
RUN cmake --build . --target install
这样做的好处很明显,啥额外配置都不用,import osgeo 开箱即用,符合 Linux 发行版一向的“安装即用”的惯例。不过要注意,改成 /usr 意味着需要有往 /usr 目录下写入文件的权限。Ubuntu 基础镜像用 root 用户跑默认没问题,但如果用了 --user 或者非 root 用户来执行安装,那可能就行不通了,这时候建议乖乖用回方案一。
最后再补充几条实战小贴士,能帮你少走弯路:
RUN python3 -c "from osgeo import gdal; print(gdal.__version__)"
python3-dev(开发头文件)和 python3-numpy(运行时依赖)。少一个都可能会在编译或运行时报奇奇怪怪的错误。RUN apt-get update && apt-get install -y python3-dev python3-numpy
以上两个方案,根据自己项目的场景任选一个,就能彻底摆脱 osgeo 找不到模块的烦恼,让 gdal2tiles.py 和其他 GDAL 的 Python 工具在 Docker 容器里安安稳稳地跑起来。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述