未加载库:@rpath/libmysqlclient.21.dylib 原因:找不到图像 Django 迁移错误使用 mysqlclient DB 驱动程序和 MySQL 8 与 macOS

Posted

技术标签:

【中文标题】未加载库:@rpath/libmysqlclient.21.dylib 原因:找不到图像 Django 迁移错误使用 mysqlclient DB 驱动程序和 MySQL 8 与 macOS【英文标题】:Library not loaded: @rpath/libmysqlclient.21.dylib Reason: image not found Django migrate error using mysqlclient DB driver and MySQL 8 with macOS 【发布时间】:2019-05-04 13:31:37 【问题描述】:

在从 Django 默认使用的默认 SQLite 数据库更改为 mysql 数据库时,我在尝试运行 python manage.py migrate --database mysql 时遇到了这个棘手的错误:

Traceback (most recent call last):
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 15, in <module>
    import MySQLdb as Database
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/MySQLdb/__init__.py", line 18, in <module>
    import _mysql
ImportError: dlopen(/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/_mysql.cpython-37m-darwin.so, 2): Library not loaded: @rpath/libmysqlclient.21.dylib
  Referenced from: /Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/_mysql.cpython-37m-darwin.so
  Reason: image not found

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 20, in <module>
    execute_from_command_line( sys.argv )
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/base.py", line 316, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/base.py", line 350, in execute
    self.check()
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/base.py", line 379, in check
    include_deployment_checks=include_deployment_checks,
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/commands/migrate.py", line 59, in _run_checks
    issues = run_checks(tags=[Tags.database])
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/checks/registry.py", line 71, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/checks/database.py", line 9, in check_database_backends
    for conn in connections.all():
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/utils.py", line 217, in all
    return [self[alias] for alias in self]
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/utils.py", line 217, in <listcomp>
    return [self[alias] for alias in self]
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/utils.py", line 202, in __getitem__
    backend = load_backend(db['ENGINE'])
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/utils.py", line 110, in load_backend
    return import_module('%s.base' % backend_name)
  File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 20, in <module>
    ) from err
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?

我已经通过pip install mysqlclient 安装了mysqlclient 并通过带有brew install mysql-connector-c 的Homebrew 安装了它的连接器后收到了这个错误,所以这是一个有点令人费解的错误。 Even after following the connector instructions 通过修改连接器的 bin 文件夹中的 mysql_config 文件,我仍然遇到了这个问题。鉴于有关此连接器已知错误的文档,这似乎至少与我正在运行 macOS 有点相关。

在进一步检查我的堆栈跟踪后,我注意到顶部附近出现了 Library not loaded: @rpath/libmysqlclient.21.dylib 错误。在那之后不久,我发现了另一个可能的线索:Reason: image not found,但我不太确定这是什么意思。

我确实在/usr/local/Cellar/mysql-connector-c 中四处寻找,看看我安装的连接器是否缺少任何东西,果然,libmysqlclient.21.dylib 文件丢失了。取而代之的是我认为该文件的旧版本,因为它被命名为libmysqlclient.18.dylib。出于好奇,我复制了我的 MySQL 安装附带的 .dylib,并将该副本以相同的名称移动到连接器的文件夹和 /usr/local/lib,在那里我还找到了另一个 libmysqlclient.18.dylib 文件。但是,我的迁移仍然失败,但我确实得到了稍微不同的堆栈跟踪:

Traceback (most recent call last):
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 15, in <module>
    import MySQLdb as Database
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/MySQLdb/__init__.py", line 18, in <module>
    import _mysql
ImportError: dlopen(/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/_mysql.cpython-37m-darwin.so, 2): Library not loaded: @rpath/libmysqlclient.21.dylib
  Referenced from: /Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/_mysql.cpython-37m-darwin.so
  Reason: no suitable image found.  Did find:
    /usr/local/lib/libmysqlclient.21.dylib: file too short
    /usr/local/lib/libmysqlclient.21.dylib: file too short

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 20, in <module>
    execute_from_command_line( sys.argv )
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/base.py", line 316, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/base.py", line 350, in execute
    self.check()
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/base.py", line 379, in check
    include_deployment_checks=include_deployment_checks,
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/management/commands/migrate.py", line 59, in _run_checks
    issues = run_checks(tags=[Tags.database])
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/checks/registry.py", line 71, in run_checks
    new_errors = check(app_configs=app_configs)
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/core/checks/database.py", line 9, in check_database_backends
    for conn in connections.all():
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/utils.py", line 217, in all
    return [self[alias] for alias in self]
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/utils.py", line 217, in <listcomp>
    return [self[alias] for alias in self]
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/utils.py", line 202, in __getitem__
    backend = load_backend(db['ENGINE'])
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/utils.py", line 110, in load_backend
    return import_module('%s.base' % backend_name)
  File "/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/Users/xoadra/Programming/Syntax/Python/Environments/pfitzer/lib/python3.7/site-packages/django/db/backends/mysql/base.py", line 20, in <module>
    ) from err
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?

这次我收到以下错误:

Reason: no suitable image found.  Did find:
        /usr/local/lib/libmysqlclient.21.dylib: file too short
        /usr/local/lib/libmysqlclient.21.dylib: file too short

因此,我怀疑问题可能与我的 MySQL 连接器安装的 .dylib 版本有关,但我不确定如何准确解决此问题。我确实觉得很奇怪,简单地复制一个文件就能稍微改变我的堆栈跟踪,所以我想我应该更多地研究一下。想法?

【问题讨论】:

【参考方案1】:

只需在 /usr/local/lib 中创建一个符号链接

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

【讨论】:

完美运行,只需确保 MySQL 文件夹名称与您所拥有的相同。就我而言,它是sudo ln -s /usr/local/mysql-8.0.19-macos10.15-x86_64/lib/libmysqlclient.21.dylib /usr/local/lib/libmysqlclient.21.dylib【参考方案2】:

我最近在我的 MacBook Pro (MacOS Catallina) 上尝试安装 Django 和 mod_wsgi 时遇到了这个问题。设置 LD_LIBRARY_PATH、DYLD_LIBRARY_PATH、添加符号链接并将 libmysqlclient.21.dylib 移动到 /usr/lib/ 均无效。 我不得不挣扎了几天,但最终我得到了这个解决方案。问题是我必须修改 libmysqlclient.21.dylib 中的库路径。幸运的是,我们有一个工具可以做到这一点。罪魁祸首是 @rpath/libmysqlclient.21.dylib。 看起来 @rpath 不起作用。

好的,您可以使用 otool 检查 .so 文件中引用的路径。它带有 Xcode。这是你在 mysql .so 文件上运行它时得到的(应该在你的站点包下的 MySQLdb 目录中)。

$ otool -L _mysql.cpython-38-darwin.so

_mysql.cpython-38-darwin.so:
    @rpath/libmysqlclient.21.dylib (compatibility version 21.0.0, current version 21.0.0)
    libssl.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)
    libcrypto.1.1.dylib (compatibility version 1.1.0, current version 1.1.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.100.1)

所以我们修改_mysql.cpython-38-darwin.so中的文件路径。有一个工具可以做到这一点。它是install_name_tool。我运行了这些命令。基本上我将@rpath 更改为绝对路径,并将libssl 和licrypto 路径更改为绝对路径。

$ install_name_tool -change @rpath/libmysqlclient.21.dylib /usr/local/mysql/lib/libmysqlclient.21.dylib _mysql.cpython-38-darwin.so

$ install_name_tool -change libssl.1.1.dylib /usr/local/mysql/lib/libssl.1.1.dylib  _mysql.cpython-38-darwin.so

$ install_name_tool -change libcrypto.1.1.dylib /usr/local/mysql/lib/libcrypto.1.1.dylib _mysql.cpython-38-darwin.so

在这些更改之后,我的 Django 运行良好。

【讨论】:

谢谢!这是在 Mac 上对我有用的唯一解决方案。 谢谢!它也对我有用(MacOS Big Sur、MySQL 8、python 3.8、Django 3.2.2)。尽管我只运行了您解决方案的第一行。似乎已经足够了。 伙计,你是救生员。过去 1 天一直卡在这个问题上 最好使用现有的通用软链接。类似install_name_tool -change @rpath/libmysqlclient.21.dylib /usr/local/mysql/lib/libmysqlclient.dylib /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/MySQLdb/_mysql.cpython-39-darwin.so【参考方案3】:

符号链接解决方案对我有用,但在链接第一个文件后,我收到了不同文件名的相同错误消息。总的来说,我必须对三个不同的文件进行符号链接。

sudo ln -s /usr/local/mysql/lib/libmysqlclient.21.dylib /usr/local/lib/libmysqlclient.21.dylib
sudo ln -s /usr/local/mysql/lib/libssl.1.1.dylib /usr/local/lib/libssl.1.1.dylib
sudo ln -s /usr/local/mysql/lib/libcrypto.1.1.dylib /usr/local/lib/libcrypto.1.1.dylib

【讨论】:

感谢您的解决方案!我用它来安装 DBD::mysql perl 模块,在 MySQL 8.0.22、macOS Catalina、Perl 5.32 中我也遇到了这个问题【参考方案4】:

事实证明,我设法解决了我的问题,尽管是以一种非正统的方式。如果其他人正在使用带有 Python 3 和 MySQL 8 版本的 mysqlclient,请尝试一下,看看它是否有帮助! :)

我只是复制了位于我安装的 MySQL 8.0.13 中的 libmysqlclient.21.dylib 文件的副本,该文件位于 /usr/local/mysql/lib 中,并将该副本以相同的名称移动到 /usr/lib

但是,您需要在您的 Mac 上暂时禁用安全完整性保护才能执行此操作,因为如果不禁用它,您将无法或无法更改 /usr/lib 中的任何内容的权限。您可以通过启动到恢复系统来执行此操作,单击顶部菜单上的实用程序,然后打开终端并在终端中输入 csrutil disable。完成此操作后,请记住重新打开安全完整性保护!与上述过程的唯一区别是您运行csrutil enable

完成此操作后,我像以前一样在新数据库上运行我的迁移,并且成功了!老实说,我不知道这到底是一个多么好的解决方案,但到目前为止,自从我更改了连接器使用的 .dylib 的副本以来,一切都运行良好。如果您也遇到此问题,希望对您有所帮助!

您可以阅读更多关于如何禁用和启用 macOS 的安全完整性保护here。

【讨论】:

您还可以按照本文中的说明创建符号链接,我认为这比制作副本更好:afshinm.name/2016/02/05/…【参考方案5】:

我的 Python 3.6 项目正在寻找 libmysqlclient.21.dylib。我安装了 brew install mysql-client。它安装了 mysql-client 8.0。它有 libmysqlclient.21.dylib。我想在哪里使用mysql@5.6。所以我将 libmysqlclient.21.dylib 从 /usr/local/Cellar/mysql-client/8.0.19/lib 复制到 /usr/local/lib/

sudo ln -s /usr/local/Cellar/mysql-client/8.0.19/lib/libmysqlclient.21.dylib /usr/local/lib/libmysqlclient.21.dylib

【讨论】:

【参考方案6】:

我尝试了很多东西,但最终就像在 usr/local/mysql-8.0.26-macos11-x86_64/lib/ 中将文件夹 mysql-8.0.26-macos11-x86_64 重命名为“mysql”一样简单libmysqlclient.21.dylib。一旦我这样做了,一切都很好。

【讨论】:

以上是关于未加载库:@rpath/libmysqlclient.21.dylib 原因:找不到图像 Django 迁移错误使用 mysqlclient DB 驱动程序和 MySQL 8 与 macOS的主要内容,如果未能解决你的问题,请参考以下文章

未加载库/未找到图像 - Swift 4.0

应用程序崩溃 - 未加载 AuthenticationServices 库

如何解决库未加载的错误?

未加载库:@rpath/libswiftSwiftOnoneSupport.dylib

尝试使用 dlopen 加载库时未定义的符号

动态加载库的未定义符号“typeinfo”