Нет такого файла libmariadb.3.dylib ошибка при импорте MySQLdb на mac M1

Я перенес свои данные на M1 Monterey MacOS с intel macmini. Я был счастлив использовать django и mariadb пока не установил пакет с помощью homebrew . Я установил homebrew и вместе с ним установил vim, после чего мое соединение django-mariadb внезапно перестало работать

Я обнаружил, что ошибка была вызвана в python3.7/site-packages/MySQLdb/init.py в 18-й строке в моем venv.

try:
    from MySQLdb.release import version_info
    from . import _mysql  # this line causes the problem

    assert version_info == _mysql.version_info
except Exception:
    raise ImportError(
        "this is MySQLdb version {}, but _mysql is version {!r}\n_mysql: {!r}".format(
            version_info, _mysql.version_info, _mysql.__file__
        )
    )

И трассировка стека идет

Traceback (most recent call last):
  File "/Users/gwanghyeongim/Documents/revhat/basecamp/.venv/basecamp/lib/python3.7/site-packages/MySQLdb/__init__.py", line 18, in <module>
    from . import _mysql
ImportError: dlopen(/Users/gwanghyeongim/Documents/revhat/basecamp/.venv/basecamp/lib/python3.7/site-packages/MySQLdb/_mysql.cpython-37m-darwin.so, 0x0002): Library not loaded: /usr/local/opt/mariadb/lib/libmariadb.3.dylib
  Referenced from: /Users/gwanghyeongim/Documents/revhat/basecamp/.venv/basecamp/lib/python3.7/site-packages/MySQLdb/_mysql.cpython-37m-darwin.so
  Reason: tried: '/usr/local/opt/mariadb/lib/libmariadb.3.dylib' (no such file), '/usr/lib/libmariadb.3.dylib' (no such file)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/gwanghyeongim/Documents/revhat/basecamp/.venv/basecamp/lib/python3.7/site-packages/MySQLdb/__init__.py", line 24, in <module>
    version_info, _mysql.version_info, _mysql.__file__
NameError: name '_mysql' is not defined

Некоторое время назад я писал пост о том, что _mysql не определен, и решил проблему, экспортировав путь в ~/.zshrc. Но на этот раз я погуглил о загадочном файле libmariadb.3.dylib, но не смог найти удовлетворительных результатов: большинство постов было о libmysqlclient.21.dylib.

Я подозреваю, что это связано с домашней сборкой на M1. Как бы подтверждая мои подозрения, на mysqlclient github есть некоторые проблемы, и заметная одна решает похожую проблему, но мейнтейнер, похоже, не так сильно хочет помочь.

Я установил и переустановил brew, и даже попробовал установить Rosetta2 homebrew, следуя этой странице, безрезультатно.

Другая страница с проблемами домашнего пивоварения, к сожалению, тоже не сильно мне помогла.

Мое окружение выглядит следующим образом:

  • python3.7.7 установлен через installer
  • Apple M1 pro Monterey версия 12.0.01
  • mysqlclient 2.1.0

Любая помощь или мысли, пожалуйста?

Следующее относится только к тем, кто использует чип M1

В двух словах

  • используйте Rosetta homebrew
  • .
  • поставьте --no-cache-dir при установке mysqlclient

Перед выполнением описанной ниже процедуры убедитесь, что вы удалили родной homebrew.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"

и удалите родные настройки в ~/.zprofile.

eval "$(/opt/homebrew/bin/brew shellenv)"

Используйте Rosetta homebrew вместо родного homebrew. Это, похоже, вызывает начало кошмара.

arch -x86_64 zsh
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Когда вы введете команду which brew, вы увидите путь, начинающийся с /usr/local/, вот так

/usr/local/bin/brew

Теперь ваша сборка - это rosetta homebrew, а не native homebrew. Затем перейдите в вашу виртуальную среду, переустановите mysqlclient, но с тегом --no-cache-dir для install.

pip uninstall mysqlclient -y
pip install mysqlclient --no-cache-dir

Теперь попробуйте импортировать MySQLdb в shell. На этот раз он не должен регистрировать стектрейс.

python
>>> import MySQLdb

Теперь у django не будет проблем с подключением к mysql или mariadb.

Этот ответ также опубликован в теме mysqlclient.

Вернуться на верх