找不到符号:_sqlite3_enable_load_extension - 通过自制程序安装的sqlite

Xia*_*hen 7 python sqlite homebrew pysqlite

症状:在我的Django应用程序,当我打电话from pysqlite2._sqlite import *,我得到了回溯Symbol not found: _sqlite3_enable_load_extension

背景:

  • 我已经使用homebrew(python 2.7.13)安装了python,它自动安装了sqlite
  • 我正在使用命令行工具macOS 10.12,Xcode 8.2.1运行macOS 10.12.3
  • 我用pip安装了pysqlite(pysqlite 2.8.3)

我试过了

  • brew uninstall sqlitebrew uninstall python和重新安装
  • 将这些添加到我的.bash_profile

    export PATH="$(brew --prefix sqlite)/bin:$PATH"
    LDFLAGS="-L/usr/local/opt/sqlite/lib"
    CPPFLAGS="-I/usr/local/opt/sqlite/include"
    export PKG_CONFIG_PATH=“/usr/local/opt/sqlite/lib/pkgconfig”
    
    Run Code Online (Sandbox Code Playgroud)
  • python -c"import sqlite3"不会返回任何错误

追溯的要点:https://gist.github.com/xwchen/e9704fa34f0463d2117fe9fbb37922a1

jax*_*737 6

从此处复制的答案(https://github.com/Homebrew/homebrew-core/pull/3134)。如果您像我一样,则可能在安装python3之后安装了sqlite。无论如何,如果有人偶然发现了这个问题并需要答案...

如果通过自制软件安装,请先删除SQLite,python和python3

brew uninstall --force python
brew uninstall --force python3
brew uninstall --force sqlite
Run Code Online (Sandbox Code Playgroud)

这将删除所有副本。

然后确保已安装Xcode 8或更高版本

重要

通过重新安装命令行工具

xcode-select --install
sudo xcode-select --reset
Run Code Online (Sandbox Code Playgroud)

最后通过这里的 pkg文件安装命令行工具。

在搜索中寻找命令行工具。(我已经下载了“用于Xcode 8.dmg的命令行工具(macOS 10.12)”),然后打开DMG并安装在那里找到的pkg。

现在安装SQLite,然后根据需要安装python和python 3:

brew install sqlite
brew install python
brew install python3
Run Code Online (Sandbox Code Playgroud)

运行brew install python --verbose并确保没有警告,如果没有警告,则应该解决问题。

别忘了做

pip install setuptools --upgrade && pip3 install setuptools --upgrade
Run Code Online (Sandbox Code Playgroud)

  • 您应该避免使用系统 python 和任何自制版本的 python 进行开发。请改用“pyenv”。运行“brew install pyenv”。`pyenv install 2.7.18` 并且您可以将 shell env 中的本地 python 设置为 `pyenv shell 2.7.18` (2认同)

小智 6

发生这种情况可能是因为它无法找到 .so 库。 正如这里所解释的

\n\n
\n

在 OS X 上,自制软件将 sqlite3 安装为 \xe2\x80\x9ckeg-only\xe2\x80\x9d,因为否则它会干扰系统 sqlite3。这意味着 libsqlite3.dylib 最终位于 /usr/local/opt/sqlite/lib 中,而不是 /usr/local/lib 中

\n
\n\n

所以你可以简单地这样做:

\n\n
export DYLD_LIBRARY_PATH=/usr/local/opt/sqlite/lib:/usr/lib\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后你应该能够导入 sqlite3。

\n