タイトルのエラーを解決するのに苦労しました。解決方法を忘備録がてらまとめておきます。
環境情報
今回作業していた環境は以下のとおりです。
分類 | 環境 |
PC | MacBook Pro(M1, 2020) |
OS | macOS Sonoma(バージョン14.5) |
Poetry | 1.8.3 |
pyenv | 2.4.10 |
mysql | 9.0.1 |
mysql-client | 9.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
- Rosetta 2を使ってターミナル(x86環境のターミナル)を起動する。そして、Poetryの仮想環境(.venv)を一度削除し、再度、
poetry install
でライブラリ(mysqlclient)をインストールする - Poetryがx86環境のPythonを使うようにする(Poetryを一度アンインストールし、x86環境のターミナルでPoetry自体を再インストールする、
poetry env use
を使う等)
エラー2
- x86環境のターミナルで
brew install
を実行し、mysqlとmysql-clientをインストールする - 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環境のターミナルを別途作成しています。
そして、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を解消できました。
以上、参考になれば幸いです
コメント