场景:docker容器运行keybert时出现错误 No module named ‘_sqlite3‘
,是容器环境没有sqlite的库,如下图所示:
本机是能够正常导入sqlite3的,虚拟环境conda下也有该库。
python3.8版本的不可用于python3.7中,因此需要重新安装一个python3.7的
第一次尝试(没解决)
- 安装 sqlite-devel
apt-get install sqlite-devel
报错:Unable to locate package sqlite-devel
第二次尝试(没解决)
- 安装sqlite3的包
$ wget https://www.sqlite.org/2017/sqlite-autoconf-3170000.tar.gz –no-check-certificate
$ tar zxvf sqlite-autoconf-3170000.tar.gz
$ cd sqlite-autoconf-3170000
$ ./configure –prefix=/usr/local/sqlite
$ make && sudo make install
- 对python3进行重新编译
就是重新安装python环境,希望能够生成sqlite.so
$ cd Python-3.7.0
$ LD_RUN_PATH=/usr/local/sqlite/lib ./configure LDFLAGS="-L/usr/local/sqlite/lib" CPPFLAGS="-I /usr/local/sqlite/include"
$ LD_RUN_PATH=/usr/local/sqlite/lib make
$ LD_RUN_PATH=/usr/local/sqlite/lib sudo make install
第三次尝试(已解决)
如果有conda的朋友,可以很快解决该问题。
-
- 查找本机下_sqlite*.so的相关文件(不是容器内部的)
find / -name _sqlite*.so
可以看得到有python的版本信息,docker容器的环境是python3.7.15,挑了python3.7.11的虚拟环境的文件(_sqlite3.cpython-37m-x86_64-linux-gnu.so)
自己新建虚拟环境的时候,选择和容器环境相同的python版本即可
-
- 复制选定文件到容器
docker cp /data_server/conda_pkgs/python-3.7.11-h12debd9_0/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so d518b6e47e92:/usr/src/python37/lib/python3.7/lib-dynload
解释一下相关命令:
docker cp xxx id:xxx 代表复制本机文件到容器中,id代表容器id,xxx是容器文件夹的绝对路径
/usr/src/python37/lib/python3.7/lib-dynload
-
- 结果:查找容器内的_sqlite*.so文件存在,导入sqlite3成功
- 结果:查找容器内的_sqlite*.so文件存在,导入sqlite3成功
参考资料:
- https://blog.csdn.net/qq_44626060/article/details/130492396