Python 公式版 と Miniconda を両方インストールした環境で "WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available." が発生することがある

試した環境

はじめに

この記事ではpip installに失敗した問題とその解決方法を書きます。
なお、「Python 公式版」とは Python.org で配布されているバージョンのことを指し、 この呼び方は python.jp の以下の記事を参考にしました。

www.python.jp

発生した問題

下記のコマンドで venv による仮想環境を作成し、仮想環境上にパッケージをインストールしようとします。 ここでは jupyterlab をインストールしようとしてますが、この問題は jupyterlab に限らず発生します。

$ py -m venv venv
$ venv\Script\activate.bat
(venv)$ pip install jupyterlab

するとpip install実行時に以下のメッセージが出てパッケージのインストールに失敗します。

WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Collecting jupyterlab
  WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/jupyterlab/
  WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/jupyterlab/
  WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/jupyterlab/
  WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/jupyterlab/
  WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/jupyterlab/
  Could not fetch URL https://pypi.org/simple/jupyterlab/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/jupyterlab/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping
  ERROR: Could not find a version that satisfies the requirement jupyterlab (from versions: none)
ERROR: No matching distribution found for jupyterlab
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping

この問題が発生する Python 環境(インストール方法)

Python 公式版は何でもいいと思いますが、今回は chocolatey でインストールしました。

choco install python

Miniconda はインストーラでインストールしました。 インストール設定はすべてデフォルトです。 特に、"Register Miniconda3 as my default Python 3.8" にチェックが入っています。

f:id:kakashibata:20200920230604p:plainf:id:kakashibata:20200920230618p:plain
miniconda setup

原因

上記の方法でインストールした場合、 py Launcher が conda の Python を実行するようになります。 以下のコマンドで py Launcher が実行する Python を調べられます。

$ py -0p
Installed Pythons found by py Launcher for Windows
 -3.8-64        C:\Users\____\miniconda3\python.exe *

したがって、 venv の仮想環境を作成する際にpy -m venvで作成すると、 conda の Python で venv の仮想環境が作られてしまいます。 作成した環境でpythonを起動すると conda の Python であることが確認できます。

(venv)$ python
Python 3.8.3 (default, May 19 2020, 06:50:17) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

おそらく conda では仮想環境はconda createを使うことを想定しており、 venv を使った仮想環境はうまくいかないのでしょう。

解決策

ここでは2通りの解決策を示します。

解決策その1: pyではなくpythonコマンドを使う

上記の方法でインストールした場合、python コマンドに公式版の Python のパスが通っています。

$ where python
C:\Python38\python.exe
C:\Users\____\AppData\Local\Microsoft\WindowsApps\python.exe

なのでpy -m venvではなくpython -m venvで仮想環境を作成します。 こうすることで公式版の Python で venv による仮想環境が作成でき、パッケージのインストールも無事行えます。

$ python -m venv venv
$ venv\Script\activate.bat
(venv)$ pip install jupyterlab

python も公式版の Python であることが分かります。

(venv)$ python
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

解決策その2: Miniconda のインストール時に "Register Miniconda3 as my default Python 3.8" にチェックを入れずインストールする

f:id:kakashibata:20200921010342p:plain

Miniconda のインストール時に "Register Miniconda3 as my default Python 3.8" にチェックを入れずインストールした場合、 py Launcher が公式版の Python を実行するようになります。

$ py -0p
Installed Pythons found by py Launcher for Windows
 -3.8-64        C:\Python38\python.exe *

この状態ならばpy -m venvで公式版の Python で venv による仮想環境が作成でき、パッケージのインストールも無事行えます。

おわりに

公式版の Python で venv による仮想環境を作成するつもりで py Launcher を使ったのですが裏目に出てしまいました。 py Launcher は conda をインストールした時にはなく、 公式版の Python をインストールした時に使えるようになったので、 pyで公式版の Python が実行されるものだと思い込んでしまいました。
この問題が発生した時、最初は表示されたメッセージから SSL 関係が原因かと思いましたが、私のケースでは違うところに原因がありました。 表示されたメッセージでググるSSL 関連を変更する解決策も見つかるので、このメッセージが出る原因は色々あるようです。 この記事が色々考えられる原因の内の一つとして参考になればと思います。
今回は Miniconda で確認しましたが、おそらく Anaconda でも同様のことが言えるかと思います(未検証)。