【问题标题】:Django/Sqlite3 Module Load Path in Python Virtual EnvironmentPython虚拟环境中的Django/Sqlite3模块加载路径
【发布时间】:2020-11-01 11:43:48
【问题描述】:

我使用最新的 Python 版本 (3.8.3) 在 Django (3.0.8) 中开发了一个网站。我正在使用安装了 Python 3.6.9 的 Unix 服务器,其中包括 Sqlite 版本 3.7.17。 Django 显然需要 Sqlite 3.8 或更高版本。

所以,我按照此处的指南编译了最新 Python 的本地副本:https://www.a2hosting.com/kb/developer-corner/python/using-a-newer-version-of-python

我如上所述设置了一个虚拟环境,一切正常,除了 Python 仍在使用旧的 Sqlite 版本。经过数小时的工作试图弄清楚这一切,我很难过。

我可以在标准环境下通过命令行访问Python和Sqlite3:

-bash-4.2$ python --version
Python 3.6.9

-bash-4.2$ python
>>> import sqlite3, inspect
>>> sqlite3.sqlite_version
'3.7.17'

>>> inspect.getfile(sqlite3)
'opt/rh/rh-python36/root/usr/lib64/python3.6/sqlite3/__init__.py'

在虚拟环境中:

-bash-4.2$ source bin/venv/bin/activate
(venv) -bash-4.2$ python --version
Python 3.8.3

-bash-4.2$ python
>>> import sqlite3, inspect
>>> sqlite3.sqlite_version
'3.7.17'

>>> inspect.getfile(sqlite3)
'users/.../lib/python3.8/sqlite3/__init__.py

因此,尽管在虚拟环境中运行 Python 3.8.3 并指向正确的库(据我所知),但 sqlite 版本仍然与标准环境相同。任何建议将不胜感激!

【问题讨论】:

    标签: python django sqlite virtualenv


    【解决方案1】:

    好的,Laenka-Oss 提供的答案通过微调解决了我的问题:django can't find new sqlite version? (SQLite 3.8.3 or later is required (found 3.7.17))

    从源代码安装 Sqlite:

    cd ~
    wget https://www.sqlite.org/2020/sqlite-autoconf-3320300.tar.gz
    tar zxvf sqlite-autoconf-3290000.tar.gz
    cd sqlite-autoconf-3290000
    
    ./configure --prefix=$HOME/opt/sqlite --disable-dynamic-extensions --enable-static --disable-shared
    make && make install
    

    通过将这些行添加到您的 .bash_profile 来更新库路径:

    export PATH=$HOME/opt/sqlite/bin:$PATH
    export LD_LIBRARY_PATH=$HOME/opt/sqlite/lib
    export LD_RUN_PATH=$HOME/opt/sqlite/lib
    

    从源代码安装 Python:

    cd ~
    wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tar.xz
    tar xJf Python-3.8.3.tar.xz
    cd Python-3.8.3
    ./configure --prefix=$HOME/opt
    make && make install
    

    现在通过将其添加到 .bash_profile 的末尾来更新 Python 路径:

    export PATH=$HOME/opt/Python-3.8.3/bin:$PATH
    

    检查一切是否正常:

    source .bash_profile
    python3 --version
    Python 3.8.3
    
    python3
    >>> import sqlite3
    >>> sqlite3.sqlite_version
    '3.32.3'
    

    如果您遇到“SqLite 标头和版本不匹配:...”错误,请确保运行 source .bash_profile 或重新启动连接。如果这不起作用,请仔细检查 sqlite 安装是否使用了上面显示的命令。

    您的 .bash_profile 应如下所示:

    export PATH=$HOME/opt/sqlite/bin:$PATH
    export LD_LIBRARY_PATH=$HOME/opt/sqlite/lib
    export LD_RUN_PATH=$HOME/opt/sqlite/lib
    export PATH=$HOME/opt/Python-3.8.3/bin:$PATH
    

    【讨论】:

      【解决方案2】:

      SQlite3python 安装的一部分,不是外部库,也就是说,您不能使用像pip 这样的包管理器进行升级。对于每个python 版本,您将拥有不同的Sqltie 版本。但是,如果您已替换 dll 文件,则情况并非如此。 我看到一些用户在 Windows 上这样做,对我来说这是一种相当冒险的方法。

      如果您已替换 dlls,请尝试恢复它,这样的输出应该与 python 3.6.9 不同

      -bash-4.2$ python
      >>> import sqlite3, inspect
      >>> sqlite3.sqlite_version
      '3.7.17'  # would be different version here
      

      您也可以(如果需要)从版本>=Sqlite 3.8here 下载sqlite3.dll(预编译二进制)文件。然后将这个文件复制到 python 安装目录的DLLs 文件夹中。您可能需要备份旧的 sqlite3.dll 文件,以防您决定恢复。

      【讨论】:

      • 抱歉,我忘了说明我正在使用没有 root 访问权限的 Unix 服务器,所以没有 DLL。我将其添加到我的问题中。我确实安装了最新版本的 Python,它应该包含最新的 Sqlite3。但是,当我查看本地安装中的 sqlite3 文件时,它仍然显示旧版本。
      • 嗯。您可以尝试完全卸载所有 python 版本并安装一个新的最新版本。这应该可以解决问题。
      • @Sideek 你也可以尝试运行-bash-4.2$ python3,然后尝试查找sqlite 的版本,看看是否有任何不同。此外,您可以运行 cmd where pythonwhere python3 来找到应该位于 venv 中的正确结果
      • 当我运行 -bash-4.2$ python3 并读取 sqlite 版本时,我得到'3.7.17',这与我运行 python 时得到的相同,也与我运行时相同这在我的 venv 中(即使 python 版本在 venv 中确实不同)
      • 嗯。看来我能想到的唯一方法是卸载Python 3.6.9
      猜你喜欢
      • 1970-01-01
      • 2020-06-21
      • 2019-01-10
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多