Python mysqldb: 库未加载: libmysqlclient.18.dylib

178 投票
15 回答
109604 浏览
提问于 2025-04-16 19:46

我刚在我的Mac OS 10.6上为Python 2.7编译并安装了mysqldb。我创建了一个简单的测试文件,里面引入了

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>
    \namespace 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版本去哪里找它。我该在哪里设置这个呢?

15 个回答

60

我发现除了创建一个符号链接,还有其他方法可以解决这个问题。

你可以把存放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

就这样。

139

我更喜欢直接修复库,而不是去调整那些可能会因为应用程序的运行方式而不一定有效的环境变量。其实这个过程相对简单。

首先,查看错误输出,找出出问题的 Python 模块在哪里:

ImportError: dlopen(/Library/Python/2.7/site-packages/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib Referenced from: /Library/Python/2.7/site-packages/_mysql.so Reason: image not found

好的,出问题的文件是 /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)
324

我通过创建一个符号链接来解决了这个问题。也就是说,

实际的库文件在这里:

/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

撰写回答