返回

Red Hat 7.9 无Root权限编译安装 Python 3.13 + SQLite3

python

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 模块编译

问题的根本在于两点:

  1. 缺少系统级的 SQLite3 库。 Python 的 _sqlite3 模块是对系统 SQLite3 库的封装。如果系统没有,Python 也没法用。
  2. 编译时找不到库。 即便手动安装了 SQLite3,Python 编译过程也需要知道头文件 (sqlite3.h) 和库文件 (libsqlite3.solibsqlite3.a) 的位置。

解决之道:手动编译 SQLite3 + 指定路径

既然系统没装,那就自己动手。以下是几种解决思路,核心都是手动编译 SQLite3,并告诉 Python 安装脚本它的位置。

方案一:全部本地编译,统一管理

这个办法最干净,所有东西都放在自己的地盘里。

  1. 下载 SQLite3 源码:

    wget https://www.sqlite.org/2024/sqlite-autoconf-3450100.tar.gz # 替换成最新版本
    tar xzf sqlite-autoconf-3450100.tar.gz
    cd sqlite-autoconf-3450100
    
  2. 编译安装 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测试模块。

  3. 下载并解压 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
    
  4. 配置并编译 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 安装到这个目录。
  5. 验证安装:

    $HOME/my_python_install/bin/python3 -c "import sqlite3; print(sqlite3.sqlite_version)"
    

    如果输出了 SQLite 版本号,就搞定了!

方案二:利用环境变量

有些时候,可能已经有了一个非标准的 SQLite3 安装,或者想更灵活一点。

  1. (可选)如果你自己编译了 SQLite3,重复方案一的 1-2 步。

  2. 设置环境变量 SQLITE_HOME

    假如你的 SQLite3 安装在 $HOME/another_sqlite 下。在shell 中设置环境变量,例如Bash:

      export SQLITE_HOME=$HOME/another_sqlite
    
  3. 配置、构建和安装python

    ./configure --prefix=$HOME/my_python_install --enable-optimizations --with-sqlite=$SQLITE_HOME
    make
    make install
    

    --with-sqlite直接指明了SQLite3 的位置,会比使用LDFLAGS and CPPFLAGS 更直接方便一些。

  4. 测试:

    与方案一相同,使用你的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-optimizations

     make -j8
     make install
    
     ```
    
  • 多个 Python 版本: 如果需要管理多个 Python 版本,用类似的方法配置不同的 --prefix,并使用 virtualenvconda 来创建隔离的 Python 环境。

安全建议

  • 来源验证: 务必从官方网站下载 SQLite3 和 Python 源码。用 MD5 或 SHA256 校验和验证下载文件的完整性。
  • 最小化安装: 安装软件时,只安装你需要的部分。像上面用到的--disable-test-modules 就是为了减少不必要的组件,尽可能减少系统安装负担。
  • 保持更新: 定期检查 SQLite3 和 Python 的新版本,及时升级以修复安全漏洞。

通过这些方法,即使没有 root 权限,你也可以在 Red Hat 7.9 上用上带 SQLite3 的 Python 3.13。虽然麻烦了点,但至少是个可行的解决方案。