当 sqlite3 损坏时如何修复 Mac base conda 环境

问题描述 投票:0回答:2

我最近使用

mamba update python=3.9
将我的基础 conda 环境的 Python 版本从 3.8 更新到 3.9,但我无法再运行 IPython,因为 sqlite3 包似乎已损坏。

python
Python 3.9.15 | packaged by conda-forge | (main, Nov 22 2022, 08:55:37) 
[Clang 14.0.6 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/rosborn/opt/miniconda3/lib/python3.9/sqlite3/__init__.py", line 57, in <module>
    from sqlite3.dbapi2 import *
  File "/Users/rosborn/opt/miniconda3/lib/python3.9/sqlite3/dbapi2.py", line 27, in <module>
    from _sqlite3 import *
ImportError: dlopen(/Users/rosborn/opt/miniconda3/lib/python3.9/lib-dynload/_sqlite3.cpython-39-darwin.so, 0x0002): Symbol not found: (_sqlite3_enable_load_extension)
  Referenced from: '/Users/rosborn/opt/miniconda3/lib/python3.9/lib-dynload/_sqlite3.cpython-39-darwin.so'
  Expected in: '/usr/lib/libsqlite3.dylib'

因为我有另一个仍然可用的 Python 3.9 环境,我尝试复制

envs/py39/lib/sqlite3.36.0
envs/py39/lib/python3.9/sqlite3
目录,以及
envs/py39/lib/python3.9/lib-dynload/_sqlite3.cpython-39-darwin.so
因为我假设 sqlite3 库编译不正确,但这并没有解决问题。

在 Homebrew Github 上,有一个related issue,有人建议检查是否有丢失的符号。它似乎都存在并且正确。

$ nm -gj /Users/rosborn/opt/miniconda3/lib/python3.9/lib-dynload/_sqlite3.cpython-39-darwin.so | grep enable_load_extension 
_sqlite3_enable_load_extension

我不知道 Homebrew 如何安装 sqlite3,但其余修复似乎需要检查系统 libsqlite,我没有管理权限。如果它是相关的,我在 Intel Mac 上,所以它与 M1 芯片无关,因为一些相关问题似乎是。

conda 发行版是否尝试链接到系统 libsqlite?如果是,为什么这个问题不影响

py39
环境?

欢迎任何提示。如果不是基础环境,我就把有问题的删掉,重新开始。我尝试强制重新安装 sqlite3,但它似乎不能作为单独的包安装。

python sqlite conda
2个回答
2
投票

按照@merv的建议,这个问题的解决方案是强制重新安装

libsqlite
包。

$ mamba install libsqlite --force-reinstall

更新 Python 后,

sqlite3
似乎链接到 Mac 系统库,
/usr/lib/libsqlite3.dylib
,而不是 conda-forge 安装的。根据 discussions others,Apple 可能出于安全原因禁用了缺失的
_sqlite3_enable_load_extension
扩展,导致观察到的错误消息。我不知道为什么首先会出现链接错误,但幸运的是,conda 将
libsqlite
作为一个单独的包分发,因此修复很容易实现。


0
投票

我在 miniconda 上遇到了同样的问题;在这种情况下,解决方案是

conda install libsqlite --force-reinstall -y
© www.soinside.com 2019 - 2024. All rights reserved.