問題
pipを使うと、
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
のWargningが出るようになってしまった。
pip installができない。
環境
Mac book Air M2
python は pyenv 経由で使用
$ where python
/Users/ユーザー名/.pyenv/shims/python
どういった時にこのWarningが出るか?
Python が ssl モジュールを正しく認識できていないとき。
- openssl がシステムにインストールされていても、Python が正しくリンクされていない
- Python 環境に問題がある
- OpenSSL の PATH 設定に問題がある
原因:python がシステムの OpenSSL を使っていなかった
# opensslの場所を確認した結果
$ where openssl
/usr/bin/openssl
/opt/homebrew/bin/openssl
/opt/homebrew/opt/openssl/bin/openssl
/usr/bin/openssl
/opt/homebrew/bin/openssl
/opt/homebrew/opt/openssl/bin/openssl
- pyenv 経由でインストールされた Python は、デフォルトではシステムの OpenSSL とリンクされていない可能性がある
- /usr/bin/openssl は macOS にプリインストールされている古いバージョンの OpenSSL であるため、これが原因で ssl モジュールが正しく動作していない可能性があった
結果
pyenv を使って Python をインストールした際に、HomebrewのOpenSSLと正しくリンクされるように環境変数を設定し直し、Python を再インストールした。
※OpenSSLは「OpenSSL@3.3」を使用します。記事執筆時点での最新版です。現在のLTSは3.0らしいので、LTSを使う場合は適宜読み替えてください。
参考:https://endoflife.date/openssl
1 . OpenSSL@3.3 をインストール
※すでに openssl@3.3 がインストールされている場合はこのステップはスキップする
$ brew install openssl@3.3
2 . OpenSSL@3.3 のリンク確認
openssl@3.3 を優先的に使うために、次のコマンドでリンクを確認する
このコマンドで openssl@3.3 がデフォルトの OpenSSL として使用されるようになる
$ brew link --force openssl@3.3
3 . 環境変数を .zshrc に追加
openssl@3.3 をデフォルトで使いたい場合、次の環境変数を .zshrc に追加しておくと良い
# OpenSSLパスの設定
export PATH="$(brew --prefix openssl@3.3)/bin:$PATH"
# LDFLAGS と CPPFLAGS の設定
export LDFLAGS="-L$(brew --prefix openssl@3.3)/lib"
export CPPFLAGS="-I$(brew --prefix openssl@3.3)/include"
この設定を反映するには、ターミナルで以下のコマンドを実行する
source ~/.zshrc
4 . pyenv で使用している Python バージョンを確認
$ pyenv versions
pyenv install 3.10.6
5 . Python の再インストール
openssl@3.3 にリンクされた Python を pyenv を使って再インストール
環境変数を設定して、Python をビルドする際に openssl@3.3 を使用させる
$ CFLAGS="-I$(brew --prefix openssl@3.3)/include" \
LDFLAGS="-L$(brew --prefix openssl@3.3)/lib" \
pyenv install <Python_version>
# <Python_version>は上記「pyenv versions」で確認した使っているバージョンを入れる。
# 私の環境だと「pyenv install 3.10.6」となった。
補足:
pyenv を使って Python をインストールする際に、Homebrew でインストールされた OpenSSL のヘッダーファイルとライブラリを Python のビルド時に指定するためのもの。これにより、Python が ssl モジュールを正しく構築し、OpenSSL ライブラリとリンクされるようにしている。
もしpyenv install <Python_version>
で<Python_version> already exists
となる場合は、すでに入っているバージョンであるため、再インストールするには、まず既存の Python バージョンをアンインストールする必要がある
# まず、既にインストールされている Python 3.10.6 をアンインストール
$ pyenv uninstall 3.10.6
remove .../<Python_version>? [y|N] y
<Python_version> uninstalled
# アンインストール後、openssl@3.3 にリンクして再インストール
$ CFLAGS="-I$(brew --prefix openssl@3.3)/include" \
LDFLAGS="-L$(brew --prefix openssl@3.3)/lib" \
pyenv install 3.10.6
6 . Python が OpenSSL@3.3 とリンクされているか確認
これでエラーが出ず、OpenSSLのバージョンが表示されればOK
$ python -c "import ssl; print(ssl.OPENSSL_VERSION)"