はじめに
VS CodeでPythonの仮想環境を作成しようとした際、エラーが発生しました。
今回は、仮想環境の作成とpipのインストールを分けて実行することで解決しました。
その際に、venv を作成するときに内部で ensurepip が実行されることを知ったので、そのあたりを備忘録としてまとめます。
通常の仮想環境作成
Pythonでは、以下のコマンドで仮想環境を作成できます。
python -m venv venv
このコマンドでは、仮想環境を作成するだけではなく、その中にpipも導入されます。
ここで少し分かりにくかったのが、venv と pip の関係です。
venv はPythonの仮想環境を作成するための仕組みで、pipはPythonパッケージを管理するためのツールです。
そして、venv の作成時にはデフォルトで ensurepip が実行され、作成した仮想環境にpipが導入されます。
イメージとしては、
python -m venv venv
↓
仮想環境を作成
↓
ensurepipを実行
↓
仮想環境内にpipを導入
という流れです。
今回のエラー
今回はVS Codeから仮想環境を作成した際にエラーが発生しました。
そこで、仮想環境の作成自体に問題があるのか、それとも作成時に行われるpipの導入部分で問題があるのかを切り分けることにしました。
--without-pip を指定すると、pipを導入せずに仮想環境だけを作成できます。
python -m venv venv --without-pip
これで、
仮想環境の作成
↓
pipの導入を行わない
という状態になります。
その後、仮想環境を有効化してから ensurepip を実行しました。
python -m ensurepip --upgrade
これによって、仮想環境の作成とpipの導入を別々に実行できます。
pipとensurepipの整理
今回のことで、それぞれの役割を整理すると分かりやすくなりました。
venv
Pythonの仮想環境を作成するための仕組みです。
python -m venv venv
ensurepip
Pythonに用意されているモジュールで、環境にpipを導入するために使用します。
python -m ensurepip --upgrade
pip
Pythonパッケージをインストール・管理するためのツールです。
python -m pip install requests
つまり、
venv
└─ 仮想環境を作成する
ensurepip
└─ その環境にpipを導入する
pip
└─ パッケージを管理する
という関係になります。
今回の解決方法
今回はこちらの手順で解決しました。
# pipなしで仮想環境を作成
python -m venv venv --without-pip
# 仮想環境を有効化
.\venv\Scripts\Activate.ps1
# pipを導入
python -m ensurepip --upgrade
# pipを確認
python -m pip --version
普段は、
python -m venv venv
で仮想環境とpipをまとめて用意できます。
今回はVS Codeでエラーが発生したため、
python -m venv venv --without-pip
と
python -m ensurepip --upgrade
に分けて実行しました。
まとめ
今回のエラーをきっかけに、venv を作成するときにpipの導入まで行われていることを理解しました。
通常は、
python -m venv venv
で問題ありません。
一方で、仮想環境の作成時にエラーが発生した場合は、
python -m venv venv --without-pip
python -m ensurepip --upgrade
のように、仮想環境の作成とpipの導入を分けて実行することで、どの処理で問題が起きているのかを切り分けられます。
今回のようなエラーが出たときのために、この手順をメモしておきます。