utamaro’s blog

誰かの役に立つ情報を発信するブログ

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の以下の回答を見て解決方法を思いつきました。ありがとうございます。

https://stackoverflow.com/questions/59006602/dyld-library-not-loaded-usr-local-opt-openssl-lib-libssl-1-0-0-dylib#answer-59184347

最後に

ちなみにですが、コマンドを実行する前に以下のコマンドを実行していました。

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.2q1.0.2rがインストールされてるよ!と。

なんという親切さ。

ありがとうございました。