库未加载:@rpath/libmysqlclient.21.dylib原因:未找到映像使用mysqlclient db驱动程序和mysql 8 with macos时发生django migrate错误

pzfprimi  于 2021-06-18  发布在  Mysql
关注(0)|答案(5)|浏览(438)

当从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?

我在通过安装mysqlclient之后收到了这个错误 pip install mysqlclient 它的连接器通过自制的 brew install mysql-connector-c ,所以这是一个令人费解的错误。即使按照连接器说明修改 mysql_config 在连接器的bin文件夹中,我仍然遇到这个问题。这看起来至少和我运行macos有点关系,因为这个连接器的已知bug有文档。
在进一步检查我的堆栈跟踪时,我注意到 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?

这次我得到以下错误:

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

因此,我怀疑问题可能与 .dylib 我的mysql连接器安装的版本,但我不知道如何准确地修复它。我确实觉得很奇怪,仅仅复制一个文件就可以稍微改变我的堆栈跟踪,所以我想我应该进一步研究一下。思想?

o8x7eapl

o8x7eapl1#

最近我在macbookpro(macoscatalina)上安装django和mod\wsgi时遇到了这个问题。设置ld\u library\u path、dyld\u library\u path、添加sym链接以及将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中的文件路径。有一个工具。它是安装\名称\工具。我执行了这些命令。基本上,我将@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在这些变化之后工作得很好。

vc9ivgsu

vc9ivgsu2#

symlink解决方案对我很有效,但是在链接第一个文件之后,对于不同的文件名,我收到了相同的错误消息。总而言之,我必须把三个不同的文件符号化。

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
qgzx9mmu

qgzx9mmu3#

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

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

ikfrs5lh4#

我的Python3.6项目是查找libmysqlclient.21.dylib。我安装了brew安装mysql客户端。安装了mysql客户端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

svdrlsy4

svdrlsy45#

所以结果是,我设法解决了我的问题,虽然有点非正统的方式。如果其他人正在使用mysqlclient和python3和mysql 8版本,请尝试一下,看看是否有帮助!:)
我只是复制了一份 libmysqlclient.21.dylib 文件位于我安装的mysql 8.0.13中 /usr/local/mysql/lib 并将同名副本移到 /usr/lib .
但是,您需要临时禁用mac上的安全完整性保护才能执行此操作,因为您没有或无法更改对中任何内容的权限 /usr/lib 不禁用它。您可以通过启动到恢复系统来实现这一点,单击顶部菜单上的实用程序,打开终端并输入 csrutil disable 进入终点站。完成此操作后,请记住重新打开安全完整性保护!与上述过程的唯一区别在于 csrutil enable 相反。
在我这样做之后,我像以前一样在新的数据库上运行迁移,结果成功了!我真的不知道这真的是一个多么好的解决方案,但到目前为止,所有的工作都很完美,因为我改变了的副本 .dylib 连接器正在使用。我希望这有助于如果你也有这个问题!
您可以在此处阅读有关如何禁用和启用macos安全完整性保护的更多信息。

相关问题