WSLで Python の仮想環境(venv)が有効化されない原因と解決方法

WSLで Python の仮想環境(venv)が有効化されない原因と解決方法

① 結論

WSLで venv を作成したのに有効化されない、または有効化したはずなのに
pip install したパッケージが使えない原因の多くは、
「使っているPythonが想定と違う」「venvが正しく有効化されていない」「pipのインストール先がズレている」
のいずれかです。

まずは which pythonecho $VIRTUAL_ENV
「今どのPythonを使っているか」を確認し、
source venv/bin/activate
python -m pip を徹底すれば解決します。


② 症状

  • python -m venv venv は成功する
  • source venv/bin/activate を実行しても効いていない
  • pip install したのに ModuleNotFoundError が出る
  • which python/usr/bin/python3 のまま

③ 原因(原因+詳細)

原因1:venvが有効化されていない

【詳細】

venvは作成しただけでは有効になりません。
venvを作成したディレクトリで
source venv/bin/activate を実行する必要があります。
また、別ディレクトリから実行している場合や、
別シェル(fishなど)を使っている場合も有効化に失敗します。

確認コマンド

pwd
echo $VIRTUAL_ENV
which python

$VIRTUAL_ENV が空、または
which python/usr/bin/python3 を指している場合、
venvは有効化されていません。

なお、Pythonコマンド自体が認識されていない場合は、
venv以前の問題です。以下の記事で先に確認してください。


原因2:pipのインストール先がズレている

【詳細】

venvを有効化していない状態で pip install を実行すると、
グローバル環境にインストールされます。
また、venv有効化中でも pip が別Pythonに紐づいていると、
想定外の場所にインストールされます。

確認コマンド

pip --version
python -m pip --version

両方とも venv 配下を指していなければ、
インストール先がズレています。


原因3:VS Codeや実行環境が別Pythonを参照している

【詳細】

WSL+VS Code環境では、ターミナルと実行時のPythonが
別々になることがあります。
その場合、ターミナルでは動くのに、
実行時だけエラーになる現象が起きます。

確認コマンド

python -c "import sys; print(sys.executable)"

出力が venv/bin/python でなければ、
VS Code側のPython設定を見直す必要があります。


④ 切り分け手順

  1. プロジェクト直下であることを確認
  2. echo $VIRTUAL_ENV でvenv有効化を確認
  3. which python で実行Pythonを確認
  4. python -m pip --version でpipの紐づけを確認

⑤ 解決方法

手順1:venvを正しく有効化

cd プロジェクトディレクトリ
python3 -m venv venv
source venv/bin/activate

手順2:pipは必ず python -m pip を使う

python -m pip install -U pip
python -m pip install パッケージ名

手順3:混乱している場合はvenvを作り直す

deactivate
rm -rf venv
python3 -m venv venv
source venv/bin/activate
python -m pip install -r requirements.txt

⑥ 再発防止

  • 作業開始時に echo $VIRTUAL_ENV を確認する
  • pip install ではなく python -m pip を使う
  • requirements.txtで環境を固定する

⑦ それでもダメな場合

venvを有効化しても ModuleNotFoundError が出る場合は、
pipのインストール先ズレが原因の可能性が高いです。
以下の記事で詳細に切り分けています。

上記でも解決しない場合は、which python
pip --version の出力差分を確認してください。

コメント

タイトルとURLをコピーしました