Python虚拟环境中Python调用sqlite版本与命令行版本不一致如何解决
问题原因
命令行调用的sqlite3是系统独立安装的二进制程序,对应3.36.0版本;但Python内置的sqlite3扩展模块在编译时默认链接了系统全局的旧版sqlite3动态库,因此在Python中查询得到的版本为3.7.17,不符合Django运行要求。
解决方案
方法1:使用pysqlite3替代内置sqlite3(推荐,无需重新编译Python)
- 提前确认新版sqlite3的安装路径,假设你将3.36版本的sqlite3安装在
/usr/local/sqlite3.36路径下 - 激活虚拟环境,执行以下命令安装pysqlite3,绑定新版sqlite3库:
export LD_LIBRARY_PATH=/usr/local/sqlite3.36/lib:$LD_LIBRARY_PATH export CPATH=/usr/local/sqlite3.36/include:$CPATH pip install pysqlite3 --no-binary :all:
如果你的系统软件源已经提供了新版sqlite3开发包,可以直接安装预编译版本:
pip install pysqlite3-binary
- 打开Django项目的
settings.py文件,在文件最开头添加以下代码,将内置sqlite3替换为pysqlite3:
import pysqlite3 import sys sys.modules['sqlite3'] = pysqlite3
修改完成后重新启动Django即可。
方法2:重新编译Python绑定新版sqlite3(无需修改项目代码)
- 下载对应版本的Python源码包(你当前使用的是3.6.8版本)并解压
- 执行配置命令时指定新版sqlite3的安装路径:
./configure --prefix=你自定义的Python安装路径 --with-sqlite3=/usr/local/sqlite3.36
- 执行编译安装命令:
make && make install
- 使用新编译的Python重新创建虚拟环境,再安装项目依赖即可。
方法3:临时修改动态库加载路径(适合临时测试)
激活虚拟环境后,启动Python或Django服务前先设置动态库查找路径,优先加载新版sqlite3的库文件:
export LD_LIBRARY_PATH=/usr/local/sqlite3.36/lib:$LD_LIBRARY_PATH # 后续启动Django服务 python manage.py runserver
该方法仅对当前终端会话生效,每次启动服务都需要先执行上述变量设置命令。
内容的提问来源于stack exchange,提问作者Dino
相关产品推荐
相关产品推荐

