簡體   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

從 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 並通過 Homebrew 使用brew install mysql-connector-c安裝了 mysqlclient 之后收到了這個錯誤,所以這是一個有點令人費解的錯誤。 即使按照連接器說明修改連接器 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版本有關,但我不確定如何正確解決這個問題。 我確實覺得很奇怪,簡單地復制一個文件就可以稍微改變我的堆棧跟蹤,所以我想我應該多研究一下。 想法?

只需在 /usr/local/lib 中創建一個符號鏈接

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

我最近在嘗試在 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 運行良好。

所以事實證明,我設法解決了我的問題,盡管以一種非正統的方式。 如果其他人正在將 mysqlclient 與 Python 3 和 MySQL 8 版本一起使用,請嘗試一下,看看是否有幫助! :)

我只是復制了位於我的 MySQL 8.0.13 安裝中的libmysqlclient.21.dylib文件,該文件位於/usr/local/mysql/lib並將該副本以相同的名稱移動到/usr/lib

但是,您需要暫時禁用 mac 上的安全完整性保護才能執行此操作,因為如果不禁用它,您將無法或無法更改/usr/lib任何內容的權限。 您可以通過啟動進入恢復系統來執行此操作,單擊頂部菜單上的實用程序,然后打開終端並在終端中輸入csrutil disable 請記住在完成此操作后重新打開安全完整性保護! 與上述過程的唯一區別是您改為運行csrutil enable

完成此操作后,我像以前在新數據庫上一樣運行了遷移,並且成功了! 老實說,我不知道這真的是一個多么好的解決方案,但到目前為止,自從我更改了連接器正在使用的.dylib副本以來,一切都運行良好。 如果你也有這個問題,我希望這會有所幫助!

您可以在此處閱讀有關如何禁用和啟用 macOS 的安全完整性保護的更多信息

符號鏈接解決方案對我有用,但是在鏈接第一個文件后,我收到了不同文件名的相同錯誤消息。 總的來說,我必須符號鏈接三個不同的文件。

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

我的 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

我嘗試了很多東西,但最終就像在 usr/local/mysql-8.0.26-macos11-x86_64/lib/libmysqlclient.21 中將文件夾 mysql-8.0.26-macos11-x86_64 重命名為“mysql”一樣簡單.dylib。 一旦我這樣做了,一切正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM