mysqlclientを使ったらdyldエラーが起きた
from MySQLdb import _mysql
が書かれたpythonファイルを実行したら以下のエラーが発生しました。
Traceback (most recent call last): File "main.py", line 1, in <module> import MySQLdb as _mysql File "/lib/python3.8/site-packages/MySQLdb/__init__.py", line 18, in <module> from . import _mysql ImportError: dlopen(/lib/python3.8/site-packages/MySQLdb/_mysql.cpython-38-darwin.so, 2): Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib Referenced from: /usr/local/opt/mysql/lib/libmysqlclient.21.dylib Reason: image not found
このエラーによってプログラミング時間として用意していた夜の3時間と、朝の2時間が溶けました。
なんでこんなエラーが起きたのかわからなかったですし、初めての経験だったのであたふたしました。
原因について
brewでインストールしたopensslをswitchすることで解決したので、brewに関係があると思います。
エラー内容にもある通り、openssl
が問題だったのかと思います。
今回はswitch
で解決したので、依存関係の問題だったのでしょう。
ちなみに、エラーが起きたときにインストールしていたopensslについては以下のバージョンがインストールされていました。
- openssl/
- openssl@1.1/
このときwhich
コマンドを使って参照先を確認したところ、以下が出力されました。
/usr/local/opt/openssl@1.1/bin/openssl
そして、openssl@1.1
には当然ながらlibssl.1.0.0.dylib
はありません。
なので、Library not loaded:
と言われたのだと思います。
解決方法
使用しているバージョンに誤りがあると考えたので、以下のコマンドを実行しました。
brew switch openssl 1.0.2r
これだけで解決しました。
悩んでいた時間が5時間で、解決が1分未満という。。。
なんといいますか、気分が上がったあとに、疲れて萎えました。
stackoverflowの以下の回答を見て解決方法を思いつきました。ありがとうございます。
最後に
ちなみにですが、コマンドを実行する前に以下のコマンドを実行していました。
brew switch openssl 1.0
結果は
Error: openssl does not have a version "1.0" in the Cellar. openssl installed versions: 1.0.2q, 1.0.2r
そんなバージョンは無いよ!と。
1.0.2q
か1.0.2r
がインストールされてるよ!と。
なんという親切さ。
ありがとうございました。