WSL上のpython3-venvでハマったこと(ensurepip not available / no such file activate)
はじめに
WSL(Ubuntu 24.04, Python 3.12系)で python3 -m venv venv を実行したら、いきなりエラーで止まった。同じエラーで検索して来た人が一発で解決できるように、起きたことと対処法をまとめておく。
環境
- WSL2 + Ubuntu 24.04
- Python 3.12系(
python3-venv未インストール状態)
起きた現象
CTF用にpwntoolsを使いたくて、PEP 668対策として素直に仮想環境を作ろうとした。
cd ~/ctf
python3 -m venv venv
すると、こう怒られた。
The virtual environment was not created successfully because ensurepip is not
available. On Debian/Ubuntu systems, you need to install the python3-venv
package using the following command.
apt install python3.12-venv
You may need to use sudo with that command. After installing the python3-venv
package, recreate your virtual environment.
Failing command: /home/kohaku/venv/bin/python3
さらに厄介なのは、ここで一度 venv フォルダが(中途半端な状態で)出来上がってしまっていること。この状態で source venv/bin/activate を叩くと、
bash: venv/bin/activate: No such file or directory
となり、「venvフォルダはあるのにactivateスクリプトが存在しない」という一見謎な状況になる。
原因
Ubuntu 24.04(Python 3.12世代)では、python3-venv(正確には python3.12-venv)パッケージがデフォルトで入っていないことがある。この状態で venv コマンドを実行すると、
- venvモジュール自体は起動できるので、フォルダ構造(
venv/bin/,venv/lib/など)は作られ始める - しかし
ensurepip(pipをインストールするための仕組み)が使えず、途中で処理が失敗する - 結果として
bin/activateやbin/pipなどの肝心なファイルが生成されないまま、中途半端なvenvフォルダだけが残る
解決策
1. 必要なパッケージをインストールする
エラーメッセージの指示通りに入れる。
sudo apt install python3.12-venv
(Pythonのバージョンが異なる場合は python3.XX-venv のXX部分を自分の環境に合わせる。python3 --version で確認可能)
2. 中途半端なvenvフォルダを一度消してから作り直す ※ 重要!!
パッケージを入れただけで、既存の venv フォルダに対してもう一度 python3 -m venv venv を実行しても、中身が正しく直らないことがある。
中途半端に生成された古いフォルダ構造の上に上書きしようとして、依然として activate が無い、といった状態が残ることがある。
なので、面倒でも一度きっぱり削除してから作り直すのが確実。
rm -rf venv
python3 -m venv venv
source venv/bin/activate
(venv) がプロンプトの先頭に付けば成功。あとは通常通り使える。
pip install pwntools
まとめ
| 症状 | 原因 | 対処 |
|---|---|---|
ensurepip is not available |
python3.XX-venv 未インストール |
sudo apt install python3.XX-venv |
venv/bin/activate: No such file or directory |
上記エラー発生時に中途半端なvenvフォルダが残っている |
rm -rf venv してから再作成 |
パッケージを入れるだけで満足して「作り直し」を忘れると、同じエラーの亜種(activateが無い)にハマるので注意。
余談
この件はCTF入門のためにpwntoolsを仮想環境に入れようとしていて遭遇した。環境構築編としてCTF入門記事とセットで出すのもよさそう。