Python mysqldb:未加载库:libmysqlclient.18.dylib
我刚刚在mac os 10.6上编译并安装了mysqldb for python 2.7。我创建了一个简单的导入测试文件Python mysqldb:未加载库:libmysqlclient.18.dylib,python,mysql-python,Python,Mysql Python,我刚刚在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",use
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
回溯(最近一次呼叫最后一次):
文件“/path/to/project/Python/src/cvdv/TestMySQLdb.py”,第4行,在
将MySQLdb作为mysql导入
文件“build/bdist.macosx-10.6-intel/egg/MySQLdb/_init__.py”,第19行,在
\命名空间cvdv
文件“build/bdist.macosx-10.6-intel/egg/_mysql.py”,第7行,在
文件“build/bdist.macosx-10.6-intel/egg/_mysql.py”,第6行,在引导程序中__
ImportError:dlopen(/Users/toom/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp//u MySQL.so,2):未加载库:libmysqlclient.18.dylib
引用自:/Users/toom/.python-eggs/MySQL\u python-1.2.3-py2.7-macosx-10.6-intel.egg-tmp//u MySQL.so
原因:找不到图像
我的问题有什么解决办法
编辑:
实际上我发现这个库位于/usr/local/mysql/lib中。所以我需要告诉我的pydeveclipse版本在哪里可以找到它。我在哪里设置这个?在pydev eclipse插件中,您可能需要为DYLD设置环境变量。可以设置路径,如中所示
我通过创建指向库的符号链接解决了这个问题。即 实际的库位于
/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
我发现这个问题还有另一个解决方案,而不是创建一个符号链接 将libmysqlclient.18.dylib所在目录的路径设置为DYLD_LIBRARY_path环境变量。我所做的是在我的.bash_配置文件中添加以下行:
export DYLD_LIBRARY_PATH=/usr/local/mysql-5.5.15-osx10.6-x86/lib/:$DYLD_LIBRARY_PATH
就是这样。我发现把它放在你的.profile或.bashrc(无论你用哪个)中是最简单的方法,sym链接比在你的源文件中保留路径更混乱 与yoshisurfs answer相比,大多数情况下安装mysql时,mysql目录应该重命名为mysql,而不是整个文件名,以便于使用
export DYLD_LIBRARY_PATH=/usr/local/mysql/lib:$DYLD_LIBRARY_PATH
我的首选方法是实际修复库,而不是使用环境变量,这些环境变量可能在范围内,也可能不在范围内,具体取决于应用程序的运行方式。这实际上是一个相当简单的过程 首先,查看错误输出以查看有问题的python模块的位置: ImportError:dlopen(/Library/Python/2.7/site-packages//\u mysql.so,2):未加载库:libmysqlclient.18.dylib 引用自:/Library/Python/2.7/site-packages//\u mysql.so 原因:找不到图像 好的,那么有问题的文件是/Library/Python/2.7/site-packages//\u 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)
在我的例子中,我在MacOSX10.9Mavericks中遇到了错误。我直接从DMG的Oracle/MySQL网站安装了MySQL社区服务器 我所需要做的就是将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文件之类的文件。这就是我最初找到动态库文件位置的方式 我遇到了这个问题,我花了一段时间才找到解决方法 我的情况略有不同。我的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不是我的选择。对于那些使用自制的用户,您可以通过以下方式解决此问题:
$ brew link mysql
当您在El Capitan时,将出现错误:
ln:/usr/lib/libmysqlclient.18.dylib:不允许操作
需要关闭“系统完整性保护”
首先,重新启动并按住cmd+R进入恢复模式,然后启动终端并键入命令:
csrutil disable
,现在您可以重新启动并重试。在新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,但在现在已过时的最终版本中,您可以在此处阅读更多关于它的内容:
问题:
Developer Beta 1中提供了一个nvram引导args命令,当以root权限运行时,该命令可以禁用SIP:
nvram boot-args="rootless=0"
El Capitan发布版本中是否也有禁用SIP的选项?或者这是严格针对开发人员构建的
答复:
此nvram引导参数命令将消失。它将不会在El Capitan发行版中提供,并可能在开发者测试版结束前消失
export DYLD_LIBRARY_PATH="/usr/local/mysql/lib:${DYLD_LIBRARY_PATH}"
export PATH="/usr/local/mysql/lib:${PATH}"
pip uninstall MySQL-python
pip install -U MySQL-python
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`