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

u3r8eeie  于 2022-12-23  发布在  SQLite
关注(0)|答案(1)|浏览(160)

我最近使用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.0envs/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,我没有管理权限。如果这是相关的,我在一个英特尔Mac上,所以它与M1芯片无关,因为一些相关的问题似乎是。
conda发行版是否试图链接到系统libsqlite?如果是,为什么这个问题不影响py39环境?
任何提示都是受欢迎的。如果它不是基础环境,我只会删除有问题的环境,然后重新开始。我尝试强制重新安装sqlite3,但它似乎不能作为单独的软件包安装。

erhoui1w

erhoui1w1#

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

$ mamba install libsqlite --force-reinstall

更新Python后,似乎sqlite3链接到了Mac系统库/usr/lib/libsqlite3.dylib,而不是conda-forge安装的那个,根据discussions elsewhere的说法,很可能是苹果出于安全考虑禁用了缺失的_sqlite3_enable_load_extension扩展,导致了观察到的错误信息,我不知道最初为什么会出现链接错误,但幸运的是,conda将libsqlite作为一个单独的包分发,因此修复很容易实现。

相关问题