Red Hat 7.9 无Root权限编译安装 Python 3.13 + SQLite3
2025-03-01 05:13:52
Red Hat 7.9 上 Python 3.13 与 SQLite3:非 root 用户的安装难题
最近遇到个头疼的问题,要在 Red Hat 7.9 的机器上(没 root 权限)从源码编译安装 Python 3.13.2。 目标是跑 Jupyter,这就需要 sqlite3。麻烦的是,系统没装 sqlite3,Python 安装时也就把它禁用了。
安装命令是这样的:
./configure --prefix my_install_directory --enable-optimizations --disable-test-modules && make -j16
configure 脚本输出提示:
checking for sqlite3 >= 3.15.2... no
checking for sqlite3.h... no
make
命令结束时也提示:
The following modules are *disabled* in configure script:
_sqlite3
这可咋整?没 root,还想装 sqlite3,还得让 Python 找得到它。
根源:系统库缺失与 Python 模块编译
问题的根本在于两点:
- 缺少系统级的 SQLite3 库。 Python 的
_sqlite3
模块是对系统 SQLite3 库的封装。如果系统没有,Python 也没法用。 - 编译时找不到库。 即便手动安装了 SQLite3,Python 编译过程也需要知道头文件 (
sqlite3.h
) 和库文件 (libsqlite3.so
或libsqlite3.a
) 的位置。
解决之道:手动编译 SQLite3 + 指定路径
既然系统没装,那就自己动手。以下是几种解决思路,核心都是手动编译 SQLite3,并告诉 Python 安装脚本它的位置。
方案一:全部本地编译,统一管理
这个办法最干净,所有东西都放在自己的地盘里。
-
下载 SQLite3 源码:
wget https://www.sqlite.org/2024/sqlite-autoconf-3450100.tar.gz # 替换成最新版本 tar xzf sqlite-autoconf-3450100.tar.gz cd sqlite-autoconf-3450100
-
编译安装 SQLite3 (到本地目录):
./configure --prefix=$HOME/my_sqlite --enable-optimizations --disable-test-modules # $HOME/my_sqlite 是你的 SQLite 安装目录 make -j4 make install
--enable-optimizations
:SQLite开启优化
--disable-test-modules
:禁止构建SQLite测试模块。 -
下载并解压 Python 源码 (如果还没做):
wget https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tgz tar xzf Python-3.13.2.tgz cd Python-3.13.2
-
配置并编译 Python,指定 SQLite3 路径:
LDFLAGS="-L$HOME/my_sqlite/lib" CPPFLAGS="-I$HOME/my_sqlite/include" ./configure --prefix=$HOME/my_python_install --enable-optimizations --disable-test-modules make -j16 make install
LDFLAGS="-L$HOME/my_sqlite/lib"
: 告诉链接器去哪里找libsqlite3.so
(或.a
)。CPPFLAGS="-I$HOME/my_sqlite/include"
: 告诉编译器去哪里找sqlite3.h
。--prefix=$HOME/my_python_install
: Python 安装到这个目录。
-
验证安装:
$HOME/my_python_install/bin/python3 -c "import sqlite3; print(sqlite3.sqlite_version)"
如果输出了 SQLite 版本号,就搞定了!
方案二:利用环境变量
有些时候,可能已经有了一个非标准的 SQLite3 安装,或者想更灵活一点。
-
(可选)如果你自己编译了 SQLite3,重复方案一的 1-2 步。
-
设置环境变量
SQLITE_HOME
:假如你的 SQLite3 安装在
$HOME/another_sqlite
下。在shell 中设置环境变量,例如Bash:export SQLITE_HOME=$HOME/another_sqlite
-
配置、构建和安装python
./configure --prefix=$HOME/my_python_install --enable-optimizations --with-sqlite=$SQLITE_HOME make make install
--with-sqlite
直接指明了SQLite3 的位置,会比使用LDFLAGS and CPPFLAGS 更直接方便一些。 -
测试:
与方案一相同,使用你的python路径启动python,尝试导入 sqlite3 并检查版本:
$HOME/my_python_install/bin/python3 -c "import sqlite3; print(sqlite3.sqlite_version)"
你应该可以看到正确的版本。
进阶技巧
-
静态链接: 如果担心部署到其他环境时缺少
.so
文件,可以考虑静态链接 SQLite3。在编译 Python 之前,编译 SQLite3 时加上-static
选项。 -
如果需要静态连接sqlite3库文件,先静态编译安装SQLite, 修改
Makefile
文件:搜索libsqlite3.la
, 将其改为libsqlite3.a
(确保在编译Python之前 执行此修改)
在 Python 的配置步骤中,加上--enable-loadable-sqlite-extensions
, 在python编译时候可能要加上--disable-shared
:
```bash
./configure LDFLAGS="-static" --prefix=/path/to/install --enable-loadable-sqlite-extensions --disable-shared --enable-optimizationsmake -j8 make install ```
-
多个 Python 版本: 如果需要管理多个 Python 版本,用类似的方法配置不同的
--prefix
,并使用virtualenv
或conda
来创建隔离的 Python 环境。
安全建议
- 来源验证: 务必从官方网站下载 SQLite3 和 Python 源码。用 MD5 或 SHA256 校验和验证下载文件的完整性。
- 最小化安装: 安装软件时,只安装你需要的部分。像上面用到的
--disable-test-modules
就是为了减少不必要的组件,尽可能减少系统安装负担。 - 保持更新: 定期检查 SQLite3 和 Python 的新版本,及时升级以修复安全漏洞。
通过这些方法,即使没有 root 权限,你也可以在 Red Hat 7.9 上用上带 SQLite3 的 Python 3.13。虽然麻烦了点,但至少是个可行的解决方案。