简体   繁体   English

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

[英]Library not loaded: @rpath/libmysqlclient.21.dylib Reason: image not found Django migrate error using mysqlclient DB driver and MySQL 8 with macOS

While changing to a MySQL database from the default SQLite one that Django uses by default, I ran into this tricky error while trying to run python manage.py migrate --database mysql :从 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?

I received this error after having already installed mysqlclient via pip install mysqlclient and its connector through Homebrew with brew install mysql-connector-c , so this is a bit of a puzzling error.我已经通过pip install mysqlclient了 mysqlclient 并通过 Homebrew 使用brew install mysql-connector-c安装了 mysqlclient 之后收到了这个错误,所以这是一个有点令人费解的错误。 Even after following the connector instructions by modifying the mysql_config file in the connector's bin folder, I still ran into this issue.即使按照连接器说明修改连接器 bin 文件夹中的mysql_config文件,我仍然遇到了这个问题。 This does appear to be at least somewhat related to that I'm running macOS given the documentation on this connector's known bug.考虑到有关此连接器已知错误的文档,这似乎至少与我正在运行 macOS 在某种程度上有关。

Upon inspecting my stack trace further, I noticed the Library not loaded: @rpath/libmysqlclient.21.dylib error up near the top.进一步检查我的堆栈跟踪后,我注意到Library not loaded: @rpath/libmysqlclient.21.dylib错误在顶部附近。 Shortly after that is another possible clue I found: Reason: image not found , but I'm not quite sure what that's supposed to mean.不久之后,我发现了另一个可能的线索: Reason: image not found ,但我不太确定那是什么意思。

I did poke around in /usr/local/Cellar/mysql-connector-c to see if there was anything possibly missing with the connector I installed, and sure enough, the libmysqlclient.21.dylib file was missing.我确实在/usr/local/Cellar/mysql-connector-c中四处寻找,看看我安装的连接器是否可能缺少任何东西,果然, libmysqlclient.21.dylib文件丢失了。 In its place was what I assume is an older version of the file since it was named libmysqlclient.18.dylib .取而代之的是我认为是该文件的旧版本,因为它被命名为libmysqlclient.18.dylib Out of curiosity, I copied the .dylib that my MySQL install came with and moved that copy under the same name to the connector's folder and to /usr/local/lib where I also found another libmysqlclient.18.dylib file.出于好奇,我复制了我的 MySQL 安装附带的.dylib并将该副本以相同的名称移动到连接器的文件夹和/usr/local/lib ,在那里我还找到了另一个libmysqlclient.18.dylib文件。 However, my migration still failed, but I did get a slightly different stack trace:然而,我的迁移仍然失败,但我确实得到了一个略有不同的堆栈跟踪:

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?

This time I get the following error:这次我收到以下错误:

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

With that, I suspect the problem may have something to do with the .dylib version that my MySQL connector installed with, but I'm not sure how to fix this exactly.有了这个,我怀疑问题可能与我的 MySQL 连接器安装的.dylib版本有关,但我不确定如何正确解决这个问题。 I do find it curious that simply copying a file over managed to change my stack trace ever so slightly so I guess I ought to look into that more.我确实觉得很奇怪,简单地复制一个文件就可以稍微改变我的堆栈跟踪,所以我想我应该多研究一下。 Thoughts?想法?

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

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

I've recently had this issue when I was trying to install Django and mod_wsgi on my MacBook pro (MacOS Catallina).我最近在尝试在 MacBook pro (MacOS Catallina) 上安装 Django 和 mod_wsgi 时遇到了这个问题。 Setting LD_LIBRARY_PATH, DYLD_LIBRARY_PATH, adding sym link and moving the libmysqlclient.21.dylib to /usr/lib/ didn't work.设置 LD_LIBRARY_PATH、DYLD_LIBRARY_PATH、添加符号链接并将 libmysqlclient.21.dylib 移动到 /usr/lib/ 不起作用。 I had to struggle for a few days but finally I got this solution.我不得不挣扎了几天,但最终我得到了这个解决方案。 The thing is I had to modify the library path in the libmysqlclient.21.dylib .问题是我必须修改libmysqlclient.21.dylib 中的库路径。 Fortunately we have a tool to do it.幸运的是,我们有一个工具可以做到这一点。 The culprit was @rpath/libmysqlclient.21.dylib .罪魁祸首是@rpath/libmysqlclient.21.dylib It looked like @rpath wasn't working.看起来@rpath不起作用。

Ok you can check the paths referred in a .so file using otool .好的,您可以使用otool检查 .so 文件中引用的路径。 It comes with Xcode.它随 Xcode 一起提供。 This is what you get when you run it on the mysql .so file (should be in the MySQLdb directory under your site-packages).这是在 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)

So we modify the filepath in the _mysql.cpython-38-darwin.so.所以我们修改了_mysql.cpython-38-darwin.so中的文件路径。 There is a tool for that.有一个工具可以做到这一点。 It is install_name_tool .它是install_name_tool I ran these commands.我运行了这些命令。 Basically I changed @rpath to absolute path, and also the libssl and the licrypto paths to absolute path.基本上我将@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

My Django worked great after these changes.在这些更改后,我的 Django 运行良好。

So it turns out that I managed to solve my issue albeit in a bit of an unorthodox manner.所以事实证明,我设法解决了我的问题,尽管以一种非正统的方式。 If anyone else is using mysqlclient with a version of Python 3 and MySQL 8, give this a try and see if it helps!如果其他人正在将 mysqlclient 与 Python 3 和 MySQL 8 版本一起使用,请尝试一下,看看是否有帮助! :) :)

I simply made a copy of the libmysqlclient.21.dylib file located in my installation of MySQL 8.0.13 which is was in /usr/local/mysql/lib and moved that copy under the same name to /usr/lib .我只是复制了位于我的 MySQL 8.0.13 安装中的libmysqlclient.21.dylib文件,该文件位于/usr/local/mysql/lib并将该副本以相同的名称移动到/usr/lib

You will however need to temporarily disable security integrity protection on your mac to do this since you won't have or be able to change permissions to anything in /usr/lib without disabling it.但是,您需要暂时禁用 mac 上的安全完整性保护才能执行此操作,因为如果不禁用它,您将无法或无法更改/usr/lib任何内容的权限。 You can do this by booting up into the recovery system, click Utilities on the menu at the top, and open up the terminal and enter csrutil disable into the terminal.您可以通过启动进入恢复系统来执行此操作,单击顶部菜单上的实用程序,然后打开终端并在终端中输入csrutil disable Just remember to turn security integrity protection back on when you're done doing this!请记住在完成此操作后重新打开安全完整性保护! The only difference from the above process will be that you run csrutil enable instead.与上述过程的唯一区别是您改为运行csrutil enable

After I did this, I ran my migrations like I did before on the new database and it worked!完成此操作后,我像以前在新数据库上一样运行了迁移,并且成功了! I honestly don't know how good of a solution this really is, but so far everything's been working perfectly since I changed the copy of .dylib the connector was using.老实说,我不知道这真的是一个多么好的解决方案,但到目前为止,自从我更改了连接器正在使用的.dylib副本以来,一切都运行良好。 I hope this helps if you also have this issue!如果你也有这个问题,我希望这会有所帮助!

You can read more about how to disable and enable macOS's security integrity protection here .您可以在此处阅读有关如何禁用和启用 macOS 的安全完整性保护的更多信息

The symlink solution worked for me, but after linking the first file, I got the same error message for a different file name.符号链接解决方案对我有用,但是在链接第一个文件后,我收到了不同文件名的相同错误消息。 In total, I had to symlink three different files.总的来说,我必须符号链接三个不同的文件。

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

My project with Python 3.6 was lookin for libmysqlclient.21.dylib.我的 Python 3.6 项目正在寻找 libmysqlclient.21.dylib。 I installed brew install mysql-client.我安装了 brew install mysql-client。 It installed mysql-client 8.0.它安装了 mysql-client 8.0。 it has libmysqlclient.21.dylib.它有 libmysqlclient.21.dylib。 Where as i wanted to use mysql@5.6.我想在哪里使用 mysql@5.6。 So I copied the libmysqlclient.21.dylib from /usr/local/Cellar/mysql-client/8.0.19/lib to /usr/local/lib/所以我将 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

I tried a lot of things but it ended up being as simple as renaming the folder mysql-8.0.26-macos11-x86_64 to "mysql" in usr/local/mysql-8.0.26-macos11-x86_64/lib/libmysqlclient.21.dylib.我尝试了很多东西,但最终就像在 usr/local/mysql-8.0.26-macos11-x86_64/lib/libmysqlclient.21 中将文件夹 mysql-8.0.26-macos11-x86_64 重命名为“mysql”一样简单.dylib。 As soon as I did that, everything worked fine.一旦我这样做了,一切正常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 库未加载:/usr/local/opt/mysql/lib/libmysqlclient.21.dylib和原因映像未找到 - Library not loaded: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib and Reason image not found 我的 mac 上的 python mysqldb 错误:未加载库:@rpath/libmysqlclient.21.dylib - python mysqldb err on my mac :Library not loaded: @rpath/libmysqlclient.21.dylib 导入 pycurl:未加载库:@rpath/libcrypto.1.1.dylib:原因:找不到图像 - import pycurl: Library not loaded: @rpath/libcrypto.1.1.dylib : Reason: image not found 为什么只运行mysql5.7的本地需要libmysqlclient.21.dylib? - Why libmysqlclient.21.dylib is needed on local with only mysql5.7 running? 使用 Conda 和 matplotlib 的英特尔 MKL 错误:macOS 上的“库未加载:@rpath/libiomp5.dylib” - Intel MKL error using Conda and matplotlib: "Library not loaded: @rpath/libiomp5.dylib" on macOS 库未加载:@ rpath / libopenblasp-r0.2.19.dylib multiarray.cpython-36m-darwin.so原因:找不到图像 - Library not loaded: @rpath/libopenblasp-r0.2.19.dylib multiarray.cpython-36m-darwin.so Reason: image not found 在OS X上使用Django中的MySQL时找不到libmysqlclient.18.dylib映像 - libmysqlclient.18.dylib image not found when using MySQL from Django on OS X macos 库上的 pymqi 未加载:@rpath/libmqic_r.dylib pymqe - pymqi on macos Library not loaded: @rpath/libmqic_r.dylib pymqe macos 库上的 pymqi 未加载:@rpath/libmqic_r.dylib - pymqi on macos Library not loaded: @rpath/libmqic_r.dylib 库未加载:libssl.1.0.0.dylib原因:找不到图像 - library not loaded: libssl.1.0.0.dylib reason: image not found
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM