我最近使用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,我没有管理权限。如果这是相关的,我在一个英特尔Mac上,所以它与M1芯片无关,因为一些相关的问题似乎是。
conda发行版是否试图链接到系统libsqlite?如果是,为什么这个问题不影响py39
环境?
任何提示都是受欢迎的。如果它不是基础环境,我只会删除有问题的环境,然后重新开始。我尝试强制重新安装sqlite3,但它似乎不能作为单独的软件包安装。
1条答案
按热度按时间erhoui1w1#
按照@merv的建议,这个问题的解决方案是强制重新安装
libsqlite
包。更新Python后,似乎
sqlite3
链接到了Mac系统库/usr/lib/libsqlite3.dylib
,而不是conda-forge安装的那个,根据discussions elsewhere的说法,很可能是苹果出于安全考虑禁用了缺失的_sqlite3_enable_load_extension
扩展,导致了观察到的错误信息,我不知道最初为什么会出现链接错误,但幸运的是,conda将libsqlite
作为一个单独的包分发,因此修复很容易实现。