【问题标题】:Can't load mysqlclient.18.dylib into python on Mac OS Lion无法在 Mac OS Lion 上将 mysqlclient.18.dylib 加载到 python 中
【发布时间】:2012-01-30 10:42:02
【问题描述】:

我想让 MySQL 在 Mac OS X Lion 中使用 Python 2.7 系统。

我知道有很多与此非常相似的问题,实际上我的症状与mysql-python installation problems (on mac os x lion) 相同。但是,这个答案似乎不适用于我的情况。

我的 Mac 是当前运行 64 位内核的 MacBook Pro:

% uname -a 
Darwin Leos-MacBook-Pro.local 11.2.0 Darwin Kernel Version 11.2.0: Tue Aug  9 20:54:00 PDT 2011; root:xnu-1699.24.8~1/RELEASE_X86_64 x86_64

Lion 上的股票 python 是一个胖二进制文件:

% file /usr/bin/python
/usr/bin/python: Mach-O universal binary with 2 architectures
/usr/bin/python (for architecture x86_64):  Mach-O 64-bit executable x86_64
/usr/bin/python (for architecture i386):    Mach-O executable i386

我使用了迁移助手,所以我的系统上安装了旧的 MySQL。我使用How to remove installation of MySQL on Mac OS X 的说明删除了旧的 MySQL 安装。

MySQL 64 位 5.5.19 是从 MySQL 站点上的 .dmg 安装的。像往常一样,这将客户端库放在/usr/local/mysql/lib 中。客户端库似乎正是我们想要的:

% file /usr/local/mysql/lib/libmysqlclient.18.dylib
/usr/local/mysql/lib/libmysqlclient.18.dylib: Mach-O 64-bit dynamically linked shared library x86_64

但是,该共享库无法加载到 python 中(我使用arch 命令来确保我正在运行 64 位图像,尽管结果是相同的,不管有没有那个):

% arch -x86_64 python
Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import cdll
>>> cdll.LoadLibrary("/usr/local/mysql/lib/libmysqlclient.18.dylib")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 431, in LoadLibrary
    return self._dlltype(name)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: dlopen(/usr/local/mysql/lib/libmysqlclient.18.dylib, 6): no suitable image found.      Did find:
    /usr/local/mysql/lib//libmysqlclient.18.dylib: mach-o, but wrong architecture
    /usr/local/mysql/lib/libmysqlclient.18.dylib: mach-o, but wrong architecture

我可以通过许多其他方式重现这个问题,特别是使用标准import MySQLdb;我正在展示重现错误的 ctypes 方式,因为我试图找出问题是在 mysql-python 中还是在 MySQL 客户端库中。从上面看,似乎是客户端库。但是,我很困惑为什么加载器认为客户端库是错误的架构。

在尝试查看问题是否是某个依赖库时,我检查了 libmysqlclient.18.dylib 中的依赖关系:

% otool -L /usr/local/mysql/lib/libmysqlclient.18.dylib
/usr/local/mysql/lib/libmysqlclient.18.dylib:
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 125.0.1)

当然/usr/lib/libSystemB.dylib 是预期的胖二进制:

% file /usr/lib/libSystem.B.dylib 
/usr/lib/libSystem.B.dylib: Mach-O universal binary with 2 architectures
/usr/lib/libSystem.B.dylib (for architecture x86_64):   Mach-O 64-bit dynamically linked shared library x86_64
/usr/lib/libSystem.B.dylib (for architecture i386): Mach-O dynamically linked shared library i386

所以... Python 是 64 位的,mysqlclient 库是 64 位的,而依赖库都是 64 位的...任何关于加载程序拒绝导入库的原因的猜测都非常受欢迎.

仅用于检查所有内容是否为 64 位的安全带和吊带:

% python -c 'import platform; print platform.platform()'
Darwin-11.2.0-x86_64-i386-64bit
% ls -l /usr/local/mysql
lrwxr-xr-x  1 root  wheel  27 Dec 10 16:52 /usr/local/mysql@ -> mysql-5.5.19-osx10.6-x86_64

此时,由于我需要真正完成一些工作,我将尝试切换到pymysql。这主要用于 Django,有一种方便的方法可以在 this thread 底部的文档中交换 pymysql。

附:我了解 macports,不能在这个系统上使用它。

【问题讨论】:

  • platform 模块不能可靠地指示使用 OS X 通用二进制文件执行 64 位还是 32 位。请改用sys.maxsize

标签: python mysql osx-lion


【解决方案1】:

您可能已通过使用defaults 或通过设置VERSIONER_PYTHON_PREFER_32_BIT 环境变量将Apple 提供的Python 的默认执行模式设置为32 位;有关详细信息,请参阅man python。在 OS X 10.6 和 10.7 中,/usr/bin/python 是 Apple 提供的包装程序,用于确定运行哪个 Python 以及在哪种模式下运行。使用arch 执行/usr/bin/python 不会影响解释器。例如:

$ unset VERSIONER_PYTHON_PREFER_32_BIT 
$ arch -x86_64 /usr/bin/python -c "import sys;print(sys.maxsize)"
9223372036854775807
$ export VERSIONER_PYTHON_PREFER_32_BIT=yes
$ arch -x86_64 /usr/bin/python -c "import sys;print(sys.maxsize)"
2147483647
#
# But avoiding the wrapper program ....
#
$ arch -x86_64 /usr/bin/python2.7 -c "import sys;print(sys.maxsize)"
9223372036854775807
$ arch -i386 /usr/bin/python2.7 -c "import sys;print(sys.maxsize)"
2147483647

【讨论】:

  • 感谢 Ned,这确实是问题所在(MySQLdb 仍然找不到该库,但这是一个不同的问题,在其他地方有详细记录)。我确实为 32 位 Python 设置了默认设置,如果我没记错的话,设置默认设置的原因是我的旧 MySQL 是 32 位的最后一轮,因此拖累了一切.
猜你喜欢
  • 2011-09-29
  • 2019-04-06
  • 2012-01-15
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
相关资源
最近更新 更多