【问题标题】:Multiple versions of Sqlite3 for Python on the same server同一台服务器上用于 Python 的多个版本的 Sqlite3
【发布时间】:2021-09-28 04:19:03
【问题描述】:

在 Linux 服务器上,我有一些使用内置 sqlite3 模块的 Python 脚本(+ 一些从源代码构建的 Sqlite 扩展,详见 Upgrade Python's sqlite3 on Debian)。

对于另一个 Python 脚本,我需要一个 更新版本的 Sqlite 共享库,而不是系统上已有的。原因:我需要Sqlitehigher than 3.25.0 for Window Functions

如果我安装它from source here 并执行makemake install,它可能会覆盖服务器上此库的先前版本,并且可能会破坏使用它的其他操作系统工具。

您如何处理拥有多个版本的 Sqlite 共享库的一般问题?

我认为 Python 虚拟环境不能用于这种情况,或者有可能吗?

注意:pip3 install --upgrade sqlite3 不存在:我们不能像这样升级 Python 内置的 sqlite3 包。顺便说一句,我们可能不应该这样做,因为它可能会破坏一些使用 Python + sqlite3 的操作系统工具。

【问题讨论】:

  • 容器? docker 还是 lxd?
  • 没办法你在system_modulescustomized_modules上有一个failure,因为如果相关的库使用相同的name_space
  • 只是为了确定,看看你的 Python 附带的 sqlite3 库版本。只需执行:python -c "import sqlite3; print(sqlite3.connect(':memory:').execute('SELECT sqlite_version();').fetchall())"

标签: python sqlite python-venv


【解决方案1】:

非常很棘手,需要在您的脚本中更改一些代码。

做什么:

  • 首先,检查一下python附带的sqlite3 版本,以防万一:

    python -c "import sqlite3; print(sqlite3.connect(':memory:').execute('SELECT sqlite_version();').fetchall())
    

    在我的电脑(python 3.8,windows)中,输出是[('3.35.5',)],这意味着python有sqlite 3.35.5库。我的系统中没有安装 sqlite:这是 python3.8 一起提供的库。

  • 如果您的 python sqlite3 库不是您需要的 :-( 您有一个替代方案:您可以使用 pysqlite3 而不是 sqlite3 标准库。在这种情况下:

    1. 您需要使用与您要使用的版本相匹配的 Sqlite3 'amalgamation' 自行构建 pysqlite3 库(稍后会详细介绍)。
    2. 您需要安装库,然后...
    3. 您将需要更改您的 python 脚本导入 import pysqlite3 as sqlite3 # instead of sqlite3

好的,什么是“合并”以及如何构建 pysqlite3?

amalgamation 是整个 sqlite3 库,只有一个 .c 文件(带有 sqlite3.h 文件)。您可以从 sqlite3 下载页面获取:sqlite3.36 amalgamation

合并后,请关注instructions to build statically pysqlite3,然后安装软件包。

现在您可以在代码中使用 pysqlite3。

【讨论】:

    【解决方案2】:

    如果您想在 2 个不同的环境中使用 2 个不同版本的 sqlite3 (python3),您可以这样做。

    既然你提到 sqlite3 是 std 库的一部分,看来你可以试试 pysqlite3 包。

    如果无法运行 pip,请先运行以下命令。

    sudo apt install python3-pip
    

    那么,

    pip install virtualenv
    
    python3 -m venv sqlitev1 #(whatever name you want)
    source sqlitev1/bin/activate
    pip install pysqlite3==0.4.4 #(this can be whatever version u want)
    source deactivate
    
    python3 -m venv sqlitev2 #(whatever name you want)
    source sqlitev2/bin/activate
    pip install pysqlite3==0.4.4 #(this can be whatever version u want)
    source deactivate
    
    

    现在您有 2 个 python 环境,sqlitev1 和 sqlitev2,以及 2 个不同版本的 sqlite3。

    【讨论】:

    • 这在sqlite 的情况下不起作用(或者您可能正在使用特定技术?)。正如我在问题中提到的,sqlite 不是您可以使用pip 更新的软件包。它是 Python 安装中的内置程序,是 std 库的一部分。
    【解决方案3】:

    如果您想要与您的发行版一起安装的不同版本的 Sqlite,以及使用该版本的 Python,那么您可以

    1. 将 sqlite 编译到其他位置
    2. 将 Python 编译到其他位置,并将其指向自定义 Sqlite 安装。

    accepted answerthis question 涵盖了“指向”。问题本身显示了如何将 sqlite 编译到自定义位置。

    该问题的other answer 建议将LD_LIBRARY_PATH 环境变量设置为包含自定义sqlite 构建的目录,以避免编译Python。这可能适用于 virtualenv(例如,它可以在 preactive 挂钩中设置)。

    另见

    另一种方法是通过自定义 sqlite 构建在 virtualenv 中编译 pysqlite3。您可以在this blog post 中阅读相关内容(我不会复制详细信息,因为不清楚该博客使用的是什么许可证)。

    【讨论】:

      【解决方案4】:

      这可能是超级hacky,但您可以制作新版本的sqlite,然后确保指向新版本的路径在内置之前的pythonpath环境中。 Python 会从头到尾扫描 python 路径以查找导入,因此新版本首先在 python 路径中查找需要新版本的进程,然后使用需要内置的旧进程排除该路径。您可以使用加载 env 然后为新服务运行 python 进程的 bash 脚本来完成此操作。

      再一次,这是超级hacky所以最后的手段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-04
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 2013-08-16
        • 1970-01-01
        相关资源
        最近更新 更多