🥞
M1(Appel Silicon) Macでpythonのmysqlclientをインストールしてつまづいた話
環境
- M1(Apple Silicon)
- mac OS Big Sur
- MySQL 8.0.25
- Python3.9(pyenvでインストール)
問題
PythonでMySQLを接続したいときに使うドライバーがいくつかあります。
その中でもmysqlclientをM1 Macで使おうと思ってインストールしようとしたのですが、以下のようなエラーが出てしまいます…
ld: warning: directory not found for option '-L/usr/local/opt/openssl/lib'
ld: warning: directory not found for option '-L/usr/local/opt/openssl/lib/'
ld: library not found for -lzstd
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command '/usr/bin/clang' failed with exit code 1
----------------------------------------
ERROR: Command errored out with exit status 1: /Users/koki/Codes/web_env/bin/python -u -c 'import io, os, sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/4r/r23l3j015rzfj1_2hv9fqczr0000gn/T/pip-install-7upzm9y4/mysqlclient_651b3cf9e475472195df0fc7e8c67572/setup.py'"'"'; __file__='"'"'/private/var/folders/4r/r23l3j015rzfj1_2hv9fqczr0000gn/T/pip-install-7upzm9y4/mysqlclient_651b3cf9e475472195df0fc7e8c67572/setup.py'"'"';f = getattr(tokenize, '"'"'open'"'"', open)(__file__) if os.path.exists(__file__) else io.StringIO('"'"'from setuptools import setup; setup()'"'"');code = f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/4r/r23l3j015rzfj1_2hv9fqczr0000gn/T/pip-record-vlufo3cd/install-record.txt --single-version-externally-managed --compile --install-headers /Users/koki/Codes/jobpit_env/include/site/python3.9/mysqlclient Check the logs for full command output.
他のドライバを使うという選択肢もあったのですが、Djangoの3系だとmysqlclientのインストールが必須なのでなんとか解決しようとしました。
調べてみたのですが、あまり情報が少なくてしかもインテル入ってるMacだと何もしなくてもこんなエラーが出ないので、悩んでいましたが乏しい情報量で解決方法を見つけ出しました。
解決策
mysql_config
を修正することでインストールができるようになりました。mysql_configの場所は以下のコマンドで確認できます。
which mysql_config
mysql_configを開いたらだいたい120行目あたりにある以下の記述を修正していきます。
libs="-L$pkglibdir"
libs="$libs -l "
この設定を以下のように書き換えます。
libs="-L$pkglibdir"
libs="$libs -lmysqlclient -lssl -lcrypto"
これでpip install mysqlclient
でうまくインストール出来ました。
Discussion