在使用Django连接MySQL时,出现“libmysqlclient.18.dylib”未找到的问题(OS X系统)。

18

我开始学习Python/Django,但遇到了第一个问题。在尝试设置settings.py中的数据库时,内部服务器出现错误:

File "/Library/Python/2.7/site-packages/django/db/backends/mysql/base.py", line 16, in <module>
raise ImproperlyConfigured("Error loading MySQLdb module: %s" % e)
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Users/rob/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.7-intel.egg-tmp/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib
Referenced from: /Users/rob/.python-eggs/MySQL_python-1.2.3-py2.7-macosx-10.7-intel.egg-tmp/_mysql.so
Reason: image not found

我找到了很多解决方案,大多数都涉及明确定义DYLD_LIBRARY_PATH值,但对我不起作用。MysQL-Python已安装(v1.2.3)。

有没有想法可以帮助我解决这个问题?

谢谢。

更新

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.mysql',  # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
    'NAME': 'django_tutorial',                      # Or path to database file if using sqlite3.
    'USER': 'root',                      # Not used with sqlite3.
    'PASSWORD': '',                  # Not used with sqlite3.
    'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
    'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
  }
}

对于OSX,作为一般惯例,我建议您使用ActiveState的PyPM软件包管理器和存储库。我曾经使用过:'sudo pypm install mysql-python',几乎从未遇到过软件包问题。 - Mihai Oprea
1
如果你只是想学习Django,那么最好从使用SQLite开始。我会在SQLite中开始我的所有项目,然后根据需要将它们迁移到真正的数据库中。 - Naftuli Kay
@TK Kocheran - 也许是这样,但我已经熟悉MySQL,并且知道我将在实际应用中使用它或PGSQL,所以我想我现在可能会克服这些成长的烦恼。 :-) - Rob Wilkerson
重复的https://dev59.com/dm445IYBdhLWcg3ws8dq#4731333。请参考该链接。 - Ned Deily
@RobWilkerson 明白了,不知道目标是什么,如果是学习Django,那就采取最简单的方式让你能够访问API。 - Naftuli Kay
显示剩余4条评论
6个回答

38

从您的评论中可以看出,libmysqlclient dylib 是使用非绝对库名称路径安装的。这与在此方面不同于大多数其他类Unix系统的 OS X 的标准实践相反。您可以通过使用 install_name_tool 修改 .so 文件中的路径来永久性地解决问题(至少在下次升级之前)。或者,您可以确保 Django 实例正在使用以下环境变量运行以使其正常工作:

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib

你也可以尝试在 /usr/local/lib 中创建一个符号链接,将其中的 dylib 链接到 /usr/local/mysql/lib 中的 dylib,因为 /usr/local/lib 在默认的动态加载搜索路径上,所以可能会使它工作(未经测试!),类似这样:

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

更好的长期解决方案是不要像在Python import MySQLdb error - Mac 10.6中提出的那样使用损坏的MySQL客户端安装。


符号链接起作用了(并且对我来说感觉不那么破坏性),所以这就是我现在的做法。感谢帮我度过这个难关。 - Rob Wilkerson
2
适用于 --> sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib - kappatech
好的答案。节省了我的时间。 - David
@Dae:感谢您注意到这个错别字!很抱歉,我看到时您提出的编辑已经被拒绝了。 - Ned Deily
谢谢!创建符号链接对我有用——但实际上我是在Haskell中安装mysql-simple。遇到了同样的问题——找不到图像。 - Eric
显示剩余2条评论

2

使用homebrew安装的mysql,以下方法适用:

$ mdfind libmysqlclient
/usr/local/Cellar/mysql/5.7.9/lib/libmysqlclient.20.dylib
/usr/local/Cellar/mysql/5.7.9/lib/libmysqlclient.a
/usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.18.dylib
/usr/local/Cellar/mysql/5.6.27/lib/libmysqlclient.a
/usr/local/Cellar/mysql/5.6.26/lib/libmysqlclient.18.dylib
/usr/local/Cellar/mysql/5.6.26/lib/libmysqlclient.a

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

1
你可能最近升级了mysql。当我使用brew将MySql从5.6升级到5.7时,遇到了这个问题。这肯定会破坏一些库,但是将mysql重新链接到5.6后问题得到解决。 因此,首先查看您之前使用的mysql版本: brew info mysql,然后使用brew switch mysql 5.6.22命令切换回该版本。

1

请确保您安装的是实际的MySql,而不仅仅是MySql-Python。MySQL-python正在尝试加载mysql库,该库应该位于类似于/usr/local/mysql-VERSION/lib的某个位置。

尝试运行以下命令:

mdfind libmysqlclient

在命令行中,扫描这些结果,如果你没有看到它缺少的文件(libmysqlclient.18.dylib),那么你可能没有正确安装mysql。


MySQL在Ruby/PHP开发中运行良好,该命令显示了我的mysql/lib路径中的库。谢谢。 - Rob Wilkerson

0

我没有足够的声望来评论Ned Deily上面的答案 :), 但环境变量方法对我有效,修复了拼写错误后; 应该是:

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib

如果你选择这条路线,我建议你注意两件事;确保不要通过使用“bash”对其他DYLD_LIBRARY_PATH设置进行破坏。

export DYLD_LIBRARY_PATH=$DYLD_LIBARY_PATH:/usr/local/mysql/lib

将其放入您的.bashrc文件中,这样您就不必在每个终端会话中记得设置它。

与符号链接选项相比,此方法的好处在于它将允许找到所有mysql dylib文件,而不仅仅是您特定符号链接的文件。


0

我已将我的数据库设置添加到原始问题中。谢谢。 - Rob Wilkerson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接