自制 python@2 和 python 提供损坏的 sqlite3

Posted

技术标签:

【中文标题】自制 python@2 和 python 提供损坏的 sqlite3【英文标题】:homebrew python@2 and python provides broken sqlite3 【发布时间】:2019-06-25 19:47:29 【问题描述】:

我正在使用最新版本的 macOS 和 homebrew,brew doctor 没有发现任何问题。我只是使用 brew install python, brew install python@2 来获取最新版本的python。

当我输入 python -c "import sqlite3" 时,我收到以下错误消息:

python2.7 -c "导入 sqlite3" 130 ↵ Traceback(最近一次调用最后一次):文件“”,第 1 行,在 文件 "/usr/local/Cellar/python@2/2.7.15_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sqlite3/init.py", 第 24 行,在 从 dbapi2 导入 * 文件“/usr/local/Cellar/python@2/2.7.15_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sqlite3/dbapi2.py”, 第 28 行,在 从_sqlite3导入* ImportError:dlopen(/usr/local/Cellar/python@2/2.7.15_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_sqlite3.so, 2):未找到符号:_sqlite3_enable_load_extension 引用 从: /usr/local/Cellar/python@2/2.7.15_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_sqlite3.so 预期在:/usr/lib/libsqlite3.dylib 中 /usr/local/Cellar/python@2/2.7.15_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_sqlite3.so

python -c "导入 sqlite3" 1 ↵ Traceback(最近一次调用最后一次):文件“”,第 1 行,in 文件 "/usr/local/Cellar/python/3.7.2_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/sqlite3/init.py", 第 23 行,在 从 sqlite3.dbapi2 导入 * 文件“/usr/local/Cellar/python/3.7.2_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/sqlite3/dbapi2.py”, 第 27 行,在 从_sqlite3导入* ImportError:dlopen(/usr/local/Cellar/python/3.7.2_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-darwin.so , 2):未找到符号:_sqlite3_enable_load_extension 引用 从: /usr/local/Cellar/python/3.7.2_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-darwin.so 预期在:/usr/lib/libsqlite3.dylib 中 /usr/local/Cellar/python/3.7.2_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-darwin.so

什么可能导致问题?我尝试下载python源代码并编译它,并将_sqlite3.so或_sqlite3.cpython-37m-darwin.so文件移动到brew安装的文件夹中,一切正常。 brew 会不会忘记公式中的某些内容?除了从源代码编译.so文件并手动解决问题,我还能做什么?

【问题讨论】:

macOS 10.14.3 (18D42) 和 brew doctor print "Your system is ready to brew."一切似乎都很正常。 我有相同的设置(自制 python 和 python@2),我有 import sqlite 在 3 上工作,在 2 上“没有名为 sqlite 的模块” 顺便说一句,当我运行“brew test python”时,我没有收到错误!但是当实际运行 import sqlite3 时,它会崩溃。我相信这个隐藏的测试失败会导致问题。公式有问题。 【参考方案1】:

我终于找到了错误隐藏的地方。 我所有的 macOS 设备(包括 2 个 Pros 和 1 个 Air)都共享同一个 .zshrc 文件,出于某种原因,我添加了一个 export DYLD_LIBRARY_PATH="/Users/myname/Library/Developer/Xcode/ios DeviceSupport/10.0.1 (14A403)/Symbols/usr/lib/:/usr/lib/" 这破坏了 python sqlite 共享库文件的构建,因为 sqlite 最近添加了一个名为 '_sqlite3_enable_load_extension' 的功能。

当我将 DYLD_LIBRARY_PATH 删除到过时的目录,然后 brew reinstall python 一切都很好。

顺便说一下,brew config 和 brew doctor 没有提供有关 DYLD_LIBRARY_PATH 的信息。下次我会遵守规则并提供这些信息。 问题解决了!

【讨论】:

以上是关于自制 python@2 和 python 提供损坏的 sqlite3的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 2 和 Python 3 中捕获断管

如何使用 Homebrew 在 Mac 上同时安装 Python 2 和 3?

在 OSX 上更新 Python 和包

设置默认 python 2.7。

自制python脚本监控EMC VNXe 3200存储硬盘

自制python小工具——Gadgets1.1