delhi09の勉強日記

技術トピック専用のブログです。自分用のメモ書きの投稿が多いです。あくまで「勉強日記」なので記事の内容は鵜呑みにしないでください。

pip install mysqlclient時に「ld: library not found for -lssl」が発生する。(Mac)

タイトルのエラーでハマったのでメモ。

結論

以下のコマンドを実行するとうまくいく。

$ LDFLAGS=-L/usr/local/opt/openssl/lib pip install mysqlclient

環境

pythonはvenvの仮想環境を使用

経緯

・以下のrequirements.txtを「pip install -r requirements.txt」でインストールしようとした。

[requirements.txt]
Django~=2.2.4
mysqlclient

・以下のエラーが発生

$ pip install -r requirements.txt
Collecting Django~=2.2.4
  Using cached Django-2.2.12-py3-none-any.whl (7.5 MB)
Collecting mysqlclient
  Using cached mysqlclient-1.4.6.tar.gz (85 kB)
    ERROR: Command errored out with exit status 1:
     command: {masked}/djangogirls-tutorial-docker/.venv/bin/python3 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/s3/9gt4z25j3rngg5yk2gqvy9000000gn/T/pip-install-otxdl7mw/mysqlclient/setup.py'"'"'; __file__='"'"'/private/var/folders/s3/9gt4z25j3rngg5yk2gqvy9000000gn/T/pip-install-otxdl7mw/mysqlclient/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /private/var/folders/s3/9gt4z25j3rngg5yk2gqvy9000000gn/T/pip-pip-egg-info-srkxms00
         cwd: /private/var/folders/s3/9gt4z25j3rngg5yk2gqvy9000000gn/T/pip-install-otxdl7mw/mysqlclient/
    Complete output (12 lines):
    /bin/sh: mysql_config: command not found
    /bin/sh: mariadb_config: command not found
    /bin/sh: mysql_config: command not found
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/var/folders/s3/9gt4z25j3rngg5yk2gqvy9000000gn/T/pip-install-otxdl7mw/mysqlclient/setup.py", line 16, in <module>
        metadata, options = get_config()
      File "/private/var/folders/s3/9gt4z25j3rngg5yk2gqvy9000000gn/T/pip-install-otxdl7mw/mysqlclient/setup_posix.py", line 61, in get_config
        libs = mysql_config("libs")
      File "/private/var/folders/s3/9gt4z25j3rngg5yk2gqvy9000000gn/T/pip-install-otxdl7mw/mysqlclient/setup_posix.py", line 29, in mysql_config
        raise EnvironmentError("%s not found" % (_mysql_config_path,))
    OSError: mysql_config not found
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
$

brewmysqlをインストールしてみる。

$ brew mysql install

・再度pipを実行すると、以下のエラ〜メッセージが発生。エラ〜メッセージの内容が変わったので、1個解決したようである。

$ pip install -r requirements.txt
Collecting Django~=2.2.4
  Using cached Django-2.2.12-py3-none-any.whl (7.5 MB)
Collecting mysqlclient
  Using cached mysqlclient-1.4.6.tar.gz (85 kB)
Collecting django-environ
  Downloading django_environ-0.4.5-py2.py3-none-any.whl (21 kB)
Collecting sqlparse
  Using cached sqlparse-0.3.1-py2.py3-none-any.whl (40 kB)
Collecting pytz
  Downloading pytz-2020.1-py2.py3-none-any.whl (510 kB)
     |████████████████████████████████| 510 kB 8.4 MB/s
Could not build wheels for mysqlclient, since package 'wheel' is not installed.
Installing collected packages: sqlparse, pytz, Django, mysqlclient, django-environ
    Running setup.py install for mysqlclient ... error
    ERROR: Command errored out with exit status 1:
     command: {masked}/djangogirls-tutorial-docker/.venv/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/s3/9gt4z25j3rngg5yk2gqvy9000000gn/T/pip-install-xf4s6plj/mysqlclient/setup.py'"'"'; __file__='"'"'/private/var/folders/s3/9gt4z25j3rngg5yk2gqvy9000000gn/T/pip-install-xf4s6plj/mysqlclient/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/s3/9gt4z25j3rngg5yk2gqvy9000000gn/T/pip-record-p6aejkrq/install-record.txt --single-version-externally-managed --compile --install-headers {masked}//djangogirls-tutorial-docker/.venv/include/site/python3.7/mysqlclient
         cwd: /private/var/folders/s3/9gt4z25j3rngg5yk2gqvy9000000gn/T/pip-install-xf4s6plj/mysqlclient/
    Complete output (30 lines):
    running install
    running build
    running build_py
    creating build
    creating build/lib.macosx-10.9-x86_64-3.7
    creating build/lib.macosx-10.9-x86_64-3.7/MySQLdb
    copying MySQLdb/__init__.py -> build/lib.macosx-10.9-x86_64-3.7/MySQLdb
    copying MySQLdb/_exceptions.py -> build/lib.macosx-10.9-x86_64-3.7/MySQLdb
    copying MySQLdb/compat.py -> build/lib.macosx-10.9-x86_64-3.7/MySQLdb
    copying MySQLdb/connections.py -> build/lib.macosx-10.9-x86_64-3.7/MySQLdb
    copying MySQLdb/converters.py -> build/lib.macosx-10.9-x86_64-3.7/MySQLdb
    copying MySQLdb/cursors.py -> build/lib.macosx-10.9-x86_64-3.7/MySQLdb
    copying MySQLdb/release.py -> build/lib.macosx-10.9-x86_64-3.7/MySQLdb
    copying MySQLdb/times.py -> build/lib.macosx-10.9-x86_64-3.7/MySQLdb
    creating build/lib.macosx-10.9-x86_64-3.7/MySQLdb/constants
    copying MySQLdb/constants/__init__.py -> build/lib.macosx-10.9-x86_64-3.7/MySQLdb/constants
    copying MySQLdb/constants/CLIENT.py -> build/lib.macosx-10.9-x86_64-3.7/MySQLdb/constants
    copying MySQLdb/constants/CR.py -> build/lib.macosx-10.9-x86_64-3.7/MySQLdb/constants
    copying MySQLdb/constants/ER.py -> build/lib.macosx-10.9-x86_64-3.7/MySQLdb/constants
    copying MySQLdb/constants/FIELD_TYPE.py -> build/lib.macosx-10.9-x86_64-3.7/MySQLdb/constants
    copying MySQLdb/constants/FLAG.py -> build/lib.macosx-10.9-x86_64-3.7/MySQLdb/constants
    running build_ext
    building 'MySQLdb._mysql' extension
    creating build/temp.macosx-10.9-x86_64-3.7
    creating build/temp.macosx-10.9-x86_64-3.7/MySQLdb
    gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG -g -fwrapv -O3 -Wall -arch x86_64 -g -Dversion_info=(1,4,6,'final',0) -D__version__=1.4.6 -I/usr/local/Cellar/mysql/8.0.19/include/mysql -I{masked}/djangogirls-tutorial-docker/.venv/include -I/Library/Frameworks/Python.framework/Versions/3.7/include/python3.7m -c MySQLdb/_mysql.c -o build/temp.macosx-10.9-x86_64-3.7/MySQLdb/_mysql.o
    gcc -bundle -undefined dynamic_lookup -arch x86_64 -g build/temp.macosx-10.9-x86_64-3.7/MySQLdb/_mysql.o -L/usr/local/Cellar/mysql/8.0.19/lib -lmysqlclient -lssl -lcrypto -o build/lib.macosx-10.9-x86_64-3.7/MySQLdb/_mysql.cpython-37m-darwin.so
    ld: library not found for -lssl
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    error: command 'gcc' failed with exit status 1
    ----------------------------------------
ERROR: Command errored out with exit status 1: {masked}/djangogirls-tutorial-docker/.venv/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/s3/9gt4z25j3rngg5yk2gqvy9000000gn/T/pip-install-xf4s6plj/mysqlclient/setup.py'"'"'; __file__='"'"'/private/var/folders/s3/9gt4z25j3rngg5yk2gqvy9000000gn/T/pip-install-xf4s6plj/mysqlclient/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /private/var/folders/s3/9gt4z25j3rngg5yk2gqvy9000000gn/T/pip-record-p6aejkrq/install-record.txt --single-version-externally-managed --compile --install-headers {masked}/djangogirls-tutorial-docker/.venv/include/site/python3.7/mysqlclient Check the logs for full command output.
$

gccをインストールしてみる。

brew install gcc

→ 状況変わらず

・エラーメッセージで検索していたところ、以下の記事を発見した。
qiita.com

・この記事の元のgithubのコメントは以下
github.com

・オプションで指定するディレクトリが存在することを確認

$ ls /usr/local/opt/openssl/lib
engines-1.1		libcrypto.dylib		libssl.dylib
libcrypto.1.1.dylib	libssl.1.1.dylib	pkgconfig
libcrypto.a		libssl.a

・記載してくださっているコマンドを実行

$ LDFLAGS=-L/usr/local/opt/openssl/lib pip install mysqlclient
Collecting mysqlclient
  Using cached mysqlclient-1.4.6.tar.gz (85 kB)
Installing collected packages: mysqlclient
    Running setup.py install for mysqlclient ... done
Successfully installed mysqlclient-1.4.6
$

→ インストールできた!