Python 导入 MySQLdb 错误 - Mac 10.6

Posted

技术标签:

【中文标题】Python 导入 MySQLdb 错误 - Mac 10.6【英文标题】:Python import MySQLdb error - Mac 10.6 【发布时间】:2011-06-11 11:23:42 【问题描述】:

我下载并遵循了 mysql 5.5.8 (http://dev.mysql.com/downloads/mysql/) 和 MySQLdb python 插件的安装说明。 (http://sourceforge.net/projects/mysql-python/)

当我尝试将 MySQLdb 导入 python 终端时,我收到以下错误:

Safira:~ yanigisawa$ python --version
Python 2.6.1
Safira:~ yanigisawa$ python -c "import MySQLdb"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "build/bdist.macosx-10.6-universal/egg/MySQLdb/__init__.py", line 19, in <module>
  File "build/bdist.macosx-10.6-universal/egg/_mysql.py", line 7, in <module>
  File "build/bdist.macosx-10.6-universal/egg/_mysql.py", line 6, in __bootstrap__
ImportError: dlopen(/Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.16.dylib
  Referenced from: /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so
  Reason: image not found
Safira:~ yanigisawa$ 

我发现了关于堆栈溢出的问题4559699,并按照那里的说明进行操作:

Safira:~ yanigisawa$ echo $DYLD_LIBRARY_PATH
/usr/local/mysql/lib
Safira:~ yanigisawa$ ls -l /usr/local/mysql/lib
total 363224
-rwxr-xr-x   1 root  wheel   3787328 Jan 18 19:41 libmysqlclient.16.dylib
-rw-r--r--   1 root  wheel  10035336 Dec  3 13:26 libmysqlclient.a
lrwxr-xr-x   1 root  wheel        23 Jan 14 22:01 libmysqlclient.dylib -> libmysqlclient.16.dylib
lrwxr-xr-x   1 root  wheel        20 Jan 14 22:01 libmysqlclient_r.16.dylib -> libmysqlclient.dylib
lrwxr-xr-x   1 root  wheel        16 Jan 14 22:01 libmysqlclient_r.a -> libmysqlclient.a
lrwxr-xr-x   1 root  wheel        20 Jan 14 22:01 libmysqlclient_r.dylib -> libmysqlclient.dylib
-rw-r--r--   1 root  wheel  88033760 Dec  3 13:22 libmysqld-debug.a
-rw-r--r--   1 root  wheel  84075304 Dec  3 13:26 libmysqld.a
-rw-r--r--   1 root  wheel      8472 Dec  3 13:26 libmysqlservices.a
drwxr-xr-x  13 root  wheel       442 Dec  3 13:53 plugin
Safira:~ yanigisawa$ md5 /usr/local/mysql/lib/libmysqlclient.16.dylib 
MD5 (/usr/local/mysql/lib/libmysqlclient.16.dylib) = b8a78a93183720021b9dbe9ddad57111
Safira:~ yanigisawa$ 

在清理了所有的 python egg 文件并重建后,我仍然遇到同样的错误。然后我在 MySQL 5.5.8 中发现了影响 Mac 10.6 的 bug 59006 (http://bugs.mysql.com/bug.php?id=59006)。我尝试了那里列出的解决方法,清理鸡蛋并重建,但我仍然收到此错误。

对于这个特定于 python 的问题是否有另一种解决方法?我还缺少其他东西吗?

编辑:添加来自 otool 命令的输出:

Safira:~ yanigisawa$ otool -L /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so
/Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so:
    libmysqlclient.16.dylib (compatibility version 16.0.0, current version 16.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
Safira:~ yanigisawa$ otool -DX /usr/local/mysql/lib/libmysqlclient.16.dylib
/usr/local/mysql/lib/libmysqlclient.16.dylib
Safira:~ yanigisawa$ 

【问题讨论】:

【参考方案1】:

就我而言,我通过添加几个符号链接来解决问题,如http://ageekstory.blogspot.com/2011/04/installing-massive-coupon-on-mac-os-10.html

如下:

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

sudo ln -s /usr/local/mysql/lib /usr/local/mysql/lib/mysql

【讨论】:

+1 这是几个小时后终于解决了我的问题,即使在 Ned Deily 的编辑似乎有效但没有成功之后 这可以解决在 Eclipse/PyDev/Django/MySQL 上看到的相同问题 - 谢谢!【参考方案2】:

您可以尝试运行 otool 以准确找出 MySQLdb C 扩展 _mysql.so 正在寻找的库路径:

$ otool -L /Users/yanigisawa/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp/_mysql.so

然后是MySQL库文件的已安装库名:

$ otool -DX /usr/local/mysql/lib/libmysqlclient.16.dylib

但您不必求助于设置DYLD_LIBRARY_PATH(或使用install_name_tool 来修改可执行文件);需要设置它几乎总是表明组件构建或安装不正确。根据我的经验,MySQL 项目在其 OS X 构建和安装程序的一致性方面没有很好的记录,因为您引用的这个问题往往证实了这一点。

试图在 OS X 10.6 中获得 PythonMySQLdbMySQL 库的有效组合是令人沮丧的一个非常常见的原因:在 SO 和其他地方有很多关于它的问题。这有很多原因。我的建议是使用来自第三方分销商之一的完整解决方案,该解决方案将构建和安装您需要的所有内容的兼容版本。如果您需要随着时间的推移升级组件,它应该会继续工作。多年来,我通过MacPorts 取得了很好的成功;其他人更喜欢Fink 或更新的HomeBrew。使用MacPorts,从MacPorts .dmg 安装基础文件后,您可以像这样构建所有内容:

$ sudo port selfupdate  # ensure the port files are up-to-date
$ sudo port install py26-mysql

MacPorts Python 将在/opt/local/bin/python2.6 提供。如果您正在寻找运行Django,也有一个端口。

编辑:使用来自otool 的更新输出,您可以看到库路径名称不匹配。 MySQLdb 扩展要求一个相对路径名(没有初始的/),而 MySQL 库用绝对路径宣传自己,通常是你想要的。这似乎与 MySQL 问题 59006 的相反,但是,在不确切知道到目前为止您执行了哪些步骤的情况下,很难说您是如何达到这种状态的。您可能可以使用install_name_tool 修补_mysql.so 以获得绝对路径名,这也将消除设置DYLD_LIBRARY_PATH 的任何需要。值得一试:

$ cd ~/.python-eggs/MySQL_python-1.2.3-py2.6-macosx-10.6-universal.egg-tmp
$ sudo install_name_tool -change libmysqlclient.16.dylib \
                                 /usr/local/mysql/lib/libmysqlclient.16.dylib \
                         _mysql.so

但这不应该让您有一种温暖而模糊的感觉,即您可以在需要更新某些内容时重现结果。试图将来自不同来源的所有这些部分粘合成有效的东西真的没有任何好处。

【讨论】:

我还是 Mac OS 的新手。 (现在大约 2 个月)我曾希望得到一个“火试验”,可以这么说,让一切或多或少地以手动方式工作。但是,如果我不能让这个工作,我将求助于使用 mac 端口选项。感谢您的建议。 MacPorts 解决方案最终奏效了。它在我的 2.6.1 安装旁边安装了 python 2.6.6,并且 /usr/bin/python 仍然指向 2.6.1,这导致我的 apache cgi 脚本出现上述相同的错误。我不得不在 2.6.6 版本中添加一个符号链接,一切都开始正常了。谢谢。 很高兴听到。但请注意:一般来说,覆盖/usr 中的任何内容都是一个非常糟糕的主意,而不是/usr/local。这一切都由 Apple 作为 OS X 的一部分进行管理。我不确定你是否意味着你覆盖了/usr/bin/python。处理多个版本更好的方法是修改 shell 启动文件以将 /opt/local/Library/Frameworks/Python.framework/Versions/2.6/bin 放在 $PATH 的前面,或者在引用 Python 时使用绝对引用,`/opt/local/bin/python2.6'。跨度> 感谢您的帮助。事实证明,这个错误正是 MySQL 错误 59006。它是一个打包错误。该错误报告顶部的解决方案完美运行。您实际上可以sudo install_name_tool -change libmysqlclient.xx.dylib /usr/local/mysql/lib/libmysqlclient.xx.dylib /usr/local/mysql/lib/libmysqlclient.xx.dylib 并且不再需要 DYLD_LIBRARY_PATH。 嗯,我自己没试过,但不应该是sudo install_name_tool -id /usr/local/mysql/lib/libmysqlclient.xx.dylib /usr/local/mysql/lib/libmysqlclient.xx.dylib吗?您想更改客户端库的共享库标识名称,不是吗?当然,您首先要使用otool -DX /usr/local/mysql/lib/libmysqlclient.xx.dylib 验证安装的客户端库名称是否错误。呃,MySQL 项目在 OS X 打包方面确实没有很好的记录。【参考方案3】:

我尝试通过使用静态库(site.cfg 中的set static = True)编译 MySQLdb 模块来解决未找到的动态库的问题。但这产生了同样的错误,因为 _mysql.o 仍然在请求动态库。为了解决这个问题,我在 setup_posix.py 中的 if static 块中添加了 libraries = []

【讨论】:

以上是关于Python 导入 MySQLdb 错误 - Mac 10.6的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试将 csv 导入 MYSQLdb 时,Python“命令不同步”错误消息

安装MYSQLdb没有错误,但我无法导入

Python MySQLdb没有导入

MySQLdb 导入从命令行工作,但在 PyCharm 中崩溃

python导入(MySQLdb)和apache python_egg_cache的问题

从 JAVA MySQLdb 导入调用 Python 脚本