繁体   English   中英

同一服务器上多个版本的 Sqlite3 for Python

[英]Multiple versions of Sqlite3 for Python on the same server

在 Linux 服务器上,我有一些 Python 脚本使用内置的sqlite3模块(+ 一些从源代码构建的 Sqlite 扩展,如在 Debian 上升级 Python 的 sqlite3 中所述)。

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

如果我从这里从源代码安装它并执行makemake install ,它可能会覆盖服务器上该库的先前版本,并且可能会破坏使用它的其他操作系统工具。

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

我不认为 Python 虚拟环境可用于此上下文,或者有可能吗?

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

非常棘手,需要在脚本中进行一些代码更改。

该怎么办:

  • 首先,检查包含在 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 库。 我已经没有源码安装在我的系统:这是一个带有python3.8库。

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

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

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

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

完成合并后,按照说明静态构建 pysqlite3 ,并安装包。

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

如果您想在 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 版本,以及一个使用该版本的 Python,那么你可以

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

“指向”包含在此问题的已接受答案中。 问题正文本身显示了如何将 sqlite 编译到自定义位置。

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

也可以看看

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

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

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

为什么不把【SQLite】单独拿出来放到你的项目中,直接在代码中引用当前路径的【SQLite】包。 能不能满足你的需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM