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

Xoa*_*dra 7 python mysql django macos

在从 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?
Run Code Online (Sandbox Code Playgroud)

我已经pip install mysqlclient通过 Homebrew with安装了 mysqlclient via和它的连接器后收到了这个错误brew install mysql-connector-c,所以这是一个令人费解的错误。 即使按照连接器说明修改mysql_config连接器的 bin 文件夹中的文件,我仍然遇到了这个问题。鉴于有关此连接器已知错误的文档,这似乎与我正在运行 macOS 至少有些相关。

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

我确实仔细/usr/local/Cellar/mysql-connector-c查看了我安装的连接器是否可能丢失了任何东西,果然,libmysqlclient.21.dylib文件丢失了。取而代之的是我认为是该文件的旧版本,因为它被命名为libmysqlclient.18.dylib. 出于好奇,我复制了.dylib我的 MySQL 安装随附的文件,并将该副本以相同的名称移动到连接器的文件夹以及/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?
Run Code Online (Sandbox Code Playgroud)

这次我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ith 14

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

sudo ln -s /usr/local/mysql/lib/libmysqlclient.21.dylib /usr/local/lib/libmysqlclient.21.dylib
Run Code Online (Sandbox Code Playgroud)


yos*_*shi 10

我最近在尝试在 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)
Run Code Online (Sandbox Code Playgroud)

所以我们修改了_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
Run Code Online (Sandbox Code Playgroud)

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


Mon*_*aro 5

对我来说,升级版本后遇到了问题MySQL,对我有用的是重新安装mysqlclientpython 依赖项,但只有当我禁用缓存时,pip install --no-cache-dir mysqlclient因为libmysqlclient.21.dylib已经被删除并被替换,libmysqlclient.22.dylib所以符号链接在这里没有帮助。


Xoa*_*dra 2

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

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

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

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

您可以在此处阅读有关如何禁用和启用 macOS 安全完整性保护的更多信息。