Python mysqldb:未加载库:libmysqlclient.18.dylib
- 2025-02-28 08:22:00
- admin 原创
- 72
问题描述:
我刚刚在 mac os 10.6 上编译并安装了 mysqldb for python 2.7。我创建了一个简单的测试文件,导入
import MySQLdb as mysql
首先,这个命令有红色下划线,信息告诉我“未解析导入”。然后我尝试运行以下简单的 Python 代码
import MySQLdb as mysql
def main():
conn = mysql.connect( charset="utf8", use_unicode=True, host="localhost",user="root", passwd="",db="" )
if __name__ == '__main__'():
main()
执行它时我收到以下错误消息
Traceback (most recent call last):
File "/path/to/project/Python/src/cvdv/TestMySQLdb.py", line 4, in <module>
import MySQLdb as mysql
File "build/bdist.macosx-10.6-intel/egg/MySQLdb/__init__.py", line 19, in <module>
amespace cvdv
File "build/bdist.macosx-10.6-intel/egg/_mysql.py", line 7, in <module>
File "build/bdist.macosx-10.6-intel/egg/_mysql.py", line 6, in __bootstrap__
ImportError: dlopen(/Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
Referenced from: /Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so
Reason: image not found
我的问题可能得到什么解决?
编辑:实际上我发现该库位于 /usr/local/mysql/lib 中。所以我需要告诉我的 pydev eclipse 版本在哪里可以找到它。我在哪里设置它?
解决方案 1:
我通过创建指向该库的符号链接解决了该问题。即
实际的图书馆位于
/usr/local/mysql/lib
然后我创建了一个符号链接
/usr/lib
使用命令:
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
因此我有以下映射:
ls -l libmysqlclient.18.dylib
lrwxr-xr-x 1 root wheel 44 16 Jul 14:01 libmysqlclient.18.dylib -> /usr/local/mysql/lib/libmysqlclient.18.dylib
就是这样。之后一切都正常了。
编辑:
请注意,自 MacOS El Capitan 以来,系统完整性保护 (SIP,也称为“无根”) 将阻止您在 中创建链接/usr/lib/
。您可以按照以下说明禁用 SIP ,但您可以改为在 中创建链接/usr/local/lib/
:
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
解决方案 2:
我首选的方法是实际修复库,而不是摆弄环境变量,因为环境变量可能在范围内,也可能不在范围内,具体取决于应用程序的运行方式。这实际上是一个相当简单的过程。
首先,查看错误输出以查看有问题的 python 模块位于何处:
ImportError:dlopen(/Library/Python/2.7/site-packages/_mysql.so,2):未加载库:libmysqlclient.18.dylib 引用自:/Library/Python/2.7/site-packages/_mysql.so 原因:未找到图像
好的,有问题的文件是 /Library/Python/2.7/site-packages/_mysql.so
接下来,找出 _mysql.so 认为应该在哪里找到 libmysqlclient.18.dylib:
% otool -L /Library/Python/2.7/site-packages/_mysql.so
/Library/Python/2.7/site-packages/_mysql.so:
libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
因此,它正在寻找没有路径信息的 libmysqlclient.18.dylib,让我们来解决这个问题:
% sudo install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib /Library/Python/2.7/site-packages/_mysql.so
现在 _mysql.so 知道库的完整路径,并且一切都正常,无论环境变量如何。
% otool -L /Library/Python/2.7/site-packages/_mysql.so
/Library/Python/2.7/site-packages/_mysql.so:
/usr/local/mysql/lib/libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
解决方案 3:
我发现除了创建符号链接之外,还有另一种解决方案。
您将 libmysqlclient.18.dylib 所在目录的路径设置为 DYLD_LIBRARY_PATH 环境变量。我所做的是将以下行放入我的 .bash_profile 中:
export DYLD_LIBRARY_PATH=/usr/local/mysql-5.5.15-osx10.6-x86/lib/:$DYLD_LIBRARY_PATH
就是这样。
解决方案 4:
就我而言,我在使用 Mac OS X 10.9 Mavericks 时遇到了错误。我直接从 DMG 的 Oracle/MySQL 网站安装了 MySQL Community Server。
我需要做的就是将 lib 文件符号链接到 /usr/local/lib 目录。
mkdir -p /usr/local/lib
ln -s /usr/local/mysql/lib/libmysql* /usr/local/lib
额外奖励:如果您也在运行 Mac OS X,那么有一个很好的工具可以查找 libmysqlclient.18.dylib 文件之类的文件,http://apps.tempel.org/FindAnyFile。 这就是我最初找到 dylib 文件位置的方法。
解决方案 5:
我发现将其放在您的 .profile 或 .bashrc(无论您使用哪个)中是最简单的方法,与将路径保存在源文件中相比,符号链接很混乱。
另外与 yoshisurfs 的回答相比,为了方便使用,大多数时候安装 mysql 时,应该将 mysql 目录重命名为 mysql,而不是整个文件名。
export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH
解决方案 6:
我在几个虚拟环境中遇到过这个问题。
pip uninstall MySQL-python
pip install -U MySQL-python
两次都有效。
解决方案 7:
在 pydev eclipse 插件中,您可能需要设置 DYLD 的环境变量。路径可以按如下所示设置
在雪豹上安装 mysqldb
解决方案 8:
对于使用自制软件的用户,你可以使用以下方法修复此问题:
$ brew link mysql
解决方案 9:
就我而言,在 El Capitan (OSX 10.11) 中,我必须执行以下操作~/.bash_profile
export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:${DYLD_LIBRARY_PATH}"
export PATH="/usr/local/mysql/lib:${PATH}"
解决方案 10:
当你在El Capitan时,会出现错误:ln: /usr/lib/libmysqlclient.18.dylib: Operation not permitted
需要关闭“系统完整性保护”。
首先,重新启动并按住 cmd + R 进入恢复模式,然后启动终端并输入命令:csrutil disable
,现在可以重新启动并重试。
解决方案 11:
在新的 El Capitan 安装中,SIP(无根阻止访问 usr/lib/)默认处于启用状态,除非您处于恢复模式,否则无法创建符号链接。正如 @yannisxu 所说,您可以禁用 SIP 并将符号链接到 /usr/lib/local,这样就可以了。
您可以在 MAC OSX El Capitan 上使用以下命令,而不是关闭 SIP:
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
以前有一个选项,您可以以 root 身份登录,这样可以禁用 SIP,但在最终版本中,该选项现已过时,您可以在此处阅读有关它的更多信息:https://forums.developer.apple.com/thread/4686
问题:
Developer Beta 1 中有一个 nvram boot-args 命令,当以 root 权限运行时可以禁用 SIP:
nvram boot-args="rootless=0"
禁用 SIP 的选项是否也会在 El Capitan 发行版中提供?还是仅限于开发者版本?
回答:
此 nvram boot-args 命令将消失。它将不会在 El Capitan 发行版中提供,并且可能会在开发者测试版结束前消失。请密切关注未来开发者测试版的发行说明。
解决方案 12:
我遇到了这个问题,花了一段时间才弄清楚如何解决它。
我的情况略有不同。我的 MySQL 服务器版本为 5.1.x。不知怎么的,我将 MySQL-python 从 1.2.3 升级到了 1.2.5。从那时起,即使我添加了以下软链接,我仍然不断遇到此问题。
libmysqlclient.18.dylib -> /usr/local/mysql/lib/libmysqlclient.18.dylib
事实证明,对于 MySQL 5.1.x,没有 libmysqlclient.18.dylib,只有 libmysqlclient.16.dylib。您可以通过将 MySQL-python 降级到 1.2.3 或将 MySQL 服务器升级到 5.6.x(我还没有尝试过 5.5.x)来解决此问题。
我将库降级到 1.2.3,因为升级 MySQL 对我来说不是一个选择。
解决方案 13:
转到http://dev.mysql.com/downloads/connector/c/并下载MySQL Connector/C。获取软件包后,创建一个新目录“mysql”,在目录mysql下解压Mysql Connector文件,然后在mysql下,创建另一个空目录“build”。我们将使用“build”来构建MySQL Connector/C。cd build && cmake ../your-MySQL-Connector-source-dir make && make install make install之后,您将在/usr/local下获得一个名为mysql的目录。它包含您需要的所有头文件和库。转到此目录,并将头文件和库复制到相应的位置。
解决方案 14:
你可以尝试:
sudo install_name_tool -change libmysqlclient.18.dylib /Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp/_mysql.so`
解决方案 15:
注意 macOS 上 MySQL Connector/C 的 bug(我当前的版本是 10.13.2),修复 mysql_config 并重新安装 mysqlclient 或 MySQL-python,以下是详细信息
扫码咨询,免费领取项目管理大礼包!