MySQLアップデートに伴うエラーの解決:Library not loaded: /usr/local/opt/mysql@5.7/lib/libmysqlclient.20.dylib、mach-o file, but is an incompatible architecture (have ‘x86_64’, need ‘arm64e’ or ‘arm64’)

error
ユウ
ユウ

タイトルのエラーを解決するのに苦労しました。解決方法を忘備録がてらまとめておきます。

今回作業していた環境は以下のとおりです。

分類環境
PCMacBook Pro(M1, 2020)
OSmacOS Sonoma(バージョン14.5)
Poetry1.8.3
pyenv2.4.10
mysql9.0.1
mysql-client9.0.1

Poetryを使ってpythonスクリプトを実行したところ、以下のエラー1が発生しました。

エラー1

ImportError: dlopen((path_to_project)/.venv/lib/python3.12/site-packages/MySQLdb/_mysql.cpython-312-darwin.so, 0x0002): tried: '(path_to_project)/.venv/lib/python3.12/site-packages/MySQLdb/_mysql.cpython-312-darwin.so' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64')), '/System/Volumes/Preboot/Cryptexes/OS/(path_to_project)/.venv/lib/python3.12/site-packages/MySQLdb/_mysql.cpython-312-darwin.so' (no such file), '(path_to_project)/.venv/lib/python3.12/site-packages/MySQLdb/_mysql.cpython-312-darwin.so' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64'))

エラー1を解消するため、試行錯誤(詳細は後述)していたところ、以下のエラー2が発生しました。

エラー2

ImportError: dlopen((path_to_project)/.venv/lib/python3.12/site-packages/MySQLdb/_mysql.cpython-312-darwin.so, 0x0002): Library not loaded: /usr/local/opt/mysql@5.7/lib/libmysqlclient.20.dylib
  Referenced from: <E8916C9D-6160-3004-A904-677DD24E42D1> (path_to_project)/.venv/lib/python3.12/site-packages/MySQLdb/_mysql.cpython-312-darwin.so
  Reason: tried: '/usr/local/opt/mysql@5.7/lib/libmysqlclient.20.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/opt/mysql@5.7/lib/libmysqlclient.20.dylib' (no such file), '/usr/local/opt/mysql@5.7/lib/libmysqlclient.20.dylib' (no such file)

以下、これらのエラーを私がどう解決したかを説明します。

概要

下記手順を順次実行することで、上記エラー1,2を解決できました。

エラー1

  1. Rosetta 2を使ってターミナル(x86環境のターミナル)を起動する。そして、Poetryの仮想環境(.venv)を一度削除し、再度、poetry installでライブラリ(mysqlclient)をインストールする
  2. Poetryがx86環境のPythonを使うようにする(Poetryを一度アンインストールし、x86環境のターミナルでPoetry自体を再インストールする、poetry env useを使う等)

エラー2

  1. x86環境のターミナルでbrew installを実行し、mysqlとmysql-clientをインストールする
  2. Poetryの仮想環境にインストールされている問題のライブラリ(mysqlclient)のアンインストールおよび再インストールを行う
ユウ
ユウ

以下、詳細に説明します

詳細

エラー1

ImportError: dlopen(/(path_to_project)/.venv/lib/python3.12/site-packages/MySQLdb/_mysql.cpython-312-darwin.so, 0x0002): tried: '/(path_to_project)/.venv/lib/python3.12/site-packages/MySQLdb/_mysql.cpython-312-darwin.so' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64')), '/System/Volumes/Preboot/Cryptexes/OS/(path_to_project)/.venv/lib/python3.12/site-packages/MySQLdb/_mysql.cpython-312-darwin.so' (no such file), '/(path_to_project)/.venv/lib/python3.12/site-packages/MySQLdb/_mysql.cpython-312-darwin.so' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64'))

まず、エラー1ですが、元々mysql 5.7を使用していたのですが、Homebrewでmysqlのバージョンが上がってしまい、それが原因で発生したようです。

エラー内容としては、mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e' or 'arm64')とあり、CPUアーキテクチャ(x86_64, arm64, arm64e)の不一致が原因のようです。

詳細には、Poetryの仮想環境下にあるライブラリMySQLdb内のファイル_mysql.cpython-312-darwin.soはx86_64用にビルドされているのですが、実行環境がAppleシリコン(arm64)環境なので、上記エラーが起きているようです。

そこで、実行環境の方をx86_64環境にするために、Rosetta 2を使ってターミナルを起動しました。Rosetta 2を使ってターミナルを起動する方法ですが、私は、以下の記事を参考に、x86_64環境のターミナルを別途作成しています。

M1 MacでARMとIntelのターミナルを切り替えて使う (Homebrew 3以降の場合) - Qiita
M1 MacではRosetta 2を使って x86, x86_64 (以下x64) のIntelアプリやライブラリを実行できるのは有名だが、ターミナルを切り替えて使うことで、ARM非対応のツールやラ…

そして、Poetryの仮想環境(.venv)を一度削除し、再度、poetry installでライブラリをインストールしました。

rm -r .venv
poetry install

なお、私は以下を実行し、プロジェクト配下に仮想環境(.venv)ができるようにしています。

poetry config virtualenvs.in-project true

そして、x86_64環境のターミナルを使って再度Poetryでスクリプトを実行したところ、今度は以下のエラーが発生しました。

dyld[50326]: Library not loaded: /Users/(user_name)/.pyenv_arm64/versions/3.12.3/lib/libpython3.12.dylib
  Referenced from: <C6D142B7-68F9-3989-BB92-C4761337A90E> /Users/(user_name)/Library/Application Support/pypoetry/venv/bin/python
  Reason: tried: '/Users/(user_name)/.pyenv_arm64/versions/3.12.3/lib/libpython3.12.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/Users/(user_name)/.pyenv_arm64/versions/3.12.3/lib/libpython3.12.dylib' (no such file), '/Users/(user_name)/.pyenv_arm64/versions/3.12.3/lib/libpython3.12.dylib' (no such file)
make: *** [start] Abort trap: 6

エラー内容を見ると、x86_64環境のターミナルでスクリプトを実行したにもかかわらず、arm64環境のpyenvを使用しているようです。なお、私は前述の記事を参考に、arm64環境とx86_64環境で.pyenvのディレクトリを分けています(.pyenv_arm64.pyenv_x86

Poetryのドキュメントを調べてみると、

By default, Poetry will try to use the Python version used during Poetry’s installation to create the virtual environment for the current project.

とあり、Poetryは、デフォルトではPoetryをインストールする時に使ったpythonバージョン(私の場合、arm環境のpython)を使うようです。

そこで、Poetryがx86環境のpythonを使うようにするため、Poetryを一度アンインストールし、x86環境のターミナルでPoetryを再インストールしました。

# アンインストール
curl -sSL https://install.python-poetry.org | python3 - --uninstall

# インストール(x86環境のターミナルで実行)
curl -sSL https://install.python-poetry.org | python3 -

ですが、今思うと、Poetryをアンインストールしなくてもpoetry env useでよかったかもしれません(参考:ドキュメント

poetry env use /full/path/to/python(x86環境のpythonのpathを指定)

Poetryの再インストールを行ったところ、以下のエラー2が今度は発生しました。

エラー2

ImportError: dlopen(/(path_to_project)/.venv/lib/python3.12/site-packages/MySQLdb/_mysql.cpython-312-darwin.so, 0x0002): Library not loaded: /usr/local/opt/mysql@5.7/lib/libmysqlclient.20.dylib
  Referenced from: <E8916C9D-6160-3004-A904-677DD24E42D1> /(path_to_project)/.venv/lib/python3.12/site-packages/MySQLdb/_mysql.cpython-312-darwin.so
  Reason: tried: '/usr/local/opt/mysql@5.7/lib/libmysqlclient.20.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/opt/mysql@5.7/lib/libmysqlclient.20.dylib' (no such file), '/usr/local/opt/mysql@5.7/lib/libmysqlclient.20.dylib' (no such file)
make: *** [start] Error 1

こちらについては、/usr/local/opt/mysql@5.7…(no such file)とあるので、mysqlがないかと思い、x86環境のターミナルでbrew installを実行し、mysqlとmysql-clientをインストールしました。

また、こちらの記事を参考に、Poetryの仮想環境にインストールされている問題のライブラリ(mysqlclient)のアンインストールおよび再インストールを行いました。これらもx86環境のターミナルで行います。

# Poetryの中に仮想環境に入る
poetry shell
# mysqlclientをアンインストール
pip uninstall mysqlclient
# mysqlclientをインストール
pip install mysqlclient

これで無事、エラー2を解消できました。

ユウ
ユウ

以上、参考になれば幸いです

プロフィール
この記事を書いた人

30代半ばで未経験でプログラマーに転職し、日々奮闘中です
プログラミング、AI、NLP、キャリア関連などで少しでも役に立てる情報を発信していきます

ユウをフォローする
errorMySQL
ユウをフォローする

コメント

タイトルとURLをコピーしました