「別のプロジェクトのライブラリを更新したら、前のプロジェクトが動かなくなった」——Pythonでよくある事故です。これを防ぐのが仮想環境 venv。プロジェクトごとに独立した環境を作る基本を解説します。
Python の仮想環境は、プロジェクトごとに独立したライブラリの置き場所を作る仕組みです。プロジェクトAでは古いバージョン、Bでは新しいバージョン——といった共存が可能になり、環境の衝突を防げます。venvは Python 3.3 以降に標準搭載なので追加インストール不要です。
「venv」は virtual environment(仮想環境) の略です。読み方に公式な決まりはありませんが、「ブイ・エンブ」「ベンブ」と読まれることが多いです。
検索で「python env」と調べる人が多いですが、venvとは別の話題であることが多いので整理します。
PATH・PYTHONPATHなどOS側の設定。os.environで読めます。#!/usr/bin/env python3 のように使います。env という名前にすることもあります(python -m venv env)。プロジェクトのフォルダで次を実行すると、venvという環境用フォルダができます。
python -m venv venv
pythonで動かない環境では python3 -m venv venv を使います。1つ目のvenvがモジュール名、2つ目が作成するフォルダ名です。
OSによってコマンドが違います。
# Windows (PowerShell)
venv\Scripts\Activate.ps1
# Windows (cmd)
venv\Scripts\activate.bat
# Mac / Linux
source venv/bin/activate
成功するとプロンプトの先頭に (venv) と表示されます。これが「今この環境の中にいる」目印です。
PowerShellの実行ポリシーが原因です。PowerShellで次を一度だけ実行します。
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
変更したくない場合は、cmdを開いて venv\Scripts\activate.bat を使えば回避できます。
有効化した状態でpipを使うと、その環境の中だけにインストールされます。
pip install requests
環境の中身をファイルに書き出せば、他のPCでも同じ環境を再現できます。
pip freeze > requirements.txt # 書き出す
pip install -r requirements.txt # 再現する
このrequirements.txtをGitで共有すれば、チーム全員が同じライブラリ構成で開発できます。
deactivate
venvはフォルダを消すだけで完全に削除できます。設定はどこにも残りません。
# Windows
rmdir /s /q venv
# Mac / Linux
rm -rf venv
壊れたと感じたら、削除して python -m venv venv で作り直し、pip install -r requirements.txt で戻すのが一番速い解決策です。
VSCodeでは Ctrl+Shift+P →「Python: インタープリターを選択」から ./venv を選ぶと、実行・デバッグ・ターミナルすべてがその環境を使うようになります。ターミナルを開き直すと自動で有効化されます。
venvフォルダはGit管理に含めない(.gitignoreに venv/ を追加)。共有するのはrequirements.txtだけでOK。pip installすると、PC全体に入ってしまうので(venv)表示を必ず確認。requirements.txtから作り直します。公式な決まりはありませんが「ブイ・エンブ」「ベンブ」と読まれることが多いです。virtual environment の略です。
別物です。venvは仮想環境ツール、envは環境変数やシェルコマンドを指すことが多いです(上の「python env との違い」参照)。
PowerShellの実行ポリシーが原因。Set-ExecutionPolicy -Scope CurrentUser RemoteSigned を実行するか、cmdで activate.bat を使ってください。
deactivateしてからvenvフォルダを削除するだけです。
「作る → 有効化 → pip install → freeze」の流れを覚えれば、環境の衝突トラブルから解放されます。壊れたら削除して作り直せるのがvenvの気軽さです。新しいプロジェクトを始めるときは、まずpython -m venv venvを習慣にしましょう。