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

2024-05-13 09:26:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚在MacOS10.6上编译并安装了mysqldbforPython2.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>
    \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版本在哪里可以找到它。我把这个放哪儿?


Tags: inpyimportbuildeggmainasline
3条回答

我首选的方法是实际修复库,而不是使用环境变量,这些变量可能在作用域中,也可能不在作用域中,具体取决于应用程序的运行方式。这实际上是一个相当简单的过程。

首先,查看错误输出,查看有问题的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//umysql.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)

我发现有另一个解决这个问题的方法,而不是创建一个符号链接。

将libmysqlclient.18.dylib所在目录的路径设置为DYLD_LIBRARY_path环境变量。我所做的是在我的.bashúu配置文件中添加以下行:

export DYLD_LIBRARY_PATH=/usr/local/mysql-5.5.15-osx10.6-x86/lib/:$DYLD_LIBRARY_PATH

就这样。

我通过创建指向库的符号链接解决了这个问题。一、 e

实际的库位于

/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/中创建链接。 您可以按照these instructions禁用SIP,但可以在/usr/local/lib/中创建链接:

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib

相关问题 更多 >