配布物のスクリプト(deploy.py など)は環境を自動で作るので、この知識がなくても動く。 これは「自動でやっていることの中身」を知りたい人のための一枚。 一度覚えれば、世の中のあらゆる Python プログラムで通用する。
| 症状 | 意味 |
|---|---|
python3: command not found |
Python が入っていない → apt install python3 python3-venv |
ModuleNotFoundError: No module named 'xxx' |
プログラムが使うライブラリが、いま使っている環境に入っていない |
pip install が externally-managed-environment で拒否される |
OS の Python に直接ライブラリを入れることを、いまの Debian/Ubuntu は禁止している(OS を壊さないため)。仕様であってエラーではない |
後ろ二つの答えが「仮想環境(venv)」。
ライブラリは「環境」に入る。OS の環境は OS のものだから触らない。 プログラムごとに、専用の小さな環境(venv)を作って、そこに入れる。 それだけ。
プログラムのあるディレクトリで:
python3 -m venv .venv # 1. 環境を作る(.venv という名前のディレクトリができる)
.venv/bin/pip install ライブラリ名 # 2. その環境にライブラリを入れる
.venv/bin/python プログラム.py # 3. その環境の Python で動かすこの三行が全てで、どんな Python プログラムでもこの型で動く。
README に「requirements.txt」があるなら 2 行目を
.venv/bin/pip install -r requirements.txt にするだけ。
- activate は要らない。入門記事は
source .venv/bin/activateを教えるが、 あれは「以後のpythonを .venv のものに差し替える」スイッチで、いまどの環境に いるのか見えなくなるのが混乱のもと。.venv/bin/pythonとパスで呼べば、 どの環境で動いているか常に明示的で、事故が起きない - .venv は使い捨て。壊れたら消して三行をやり直せばいい。大事なものは何も入っていない (大事なのはプログラムと requirements の方)。同じ理由で git に入れない(.gitignore へ)
- 環境はプログラムごと。プログラム A の .venv にライブラリを足しても B には影響しない。 「環境を分ける」とはそういう意味
これだけ知っていれば、deploy.py が初回にやっている「自動準備」も ただこの三行を代行しているだけだと分かる。