Skip to main content

venv について

何をするもの?

  • 何をするものか
    • Python の実行環境を保持しておいて、切り替えるためのもの
  • 具体的には、以下の情報をフォルダに保存
    • バージョン : venv を作成したときの python パスにエイリアスが保持される
    • pip で入れたパッケージがフォルダ内に保持される
  • 環境の切り替え
    • フォルダ内にある activate ファイルで環境変数を load
    • 元の状態に戻るには deactivate コマンド (上記Loadで有効化されるコマンドのひとつ) を実行
  • 典型的な使い方
    • プロジェクト内に .venv, venv のようなフォルダを作って配置
    • .gitignore にもあるし、それで合ってる気がする

後で見たとき用 簡易テンプレ (プロジェクト内に作る場合)

bash
python3 -m venv .venv # 作成
. .venv/bin/activate # アクティベート

activate 呼ぶタイミング

  • pip installl する際
  • プロジェクト内で python を呼ぶシェルスクリプト内
bash
pip freeze > requirements.txt   # インストールしたパッケージを requirements.txt に書き出す
pip install -r requirements.txt # requirements.txt を使ってパッケージをインストール

venv を作成

コマンド

  • python3 -m venv <環境名>

特定のディレクトリに作成するなら

bash
mkdir ~/python-venvs  # 環境を ここの下に作るとする (またはプロジェクトのフォルダ)
cd ~/python-venvs

which python3 # /opt/homebrew/bin/python3 だとする
python3 -V # 3.13.3 だったとする

python3 -m venv brew-3.13.3

→ カレントディレクトリ下に brew-3.13.3 というフォルダで環境が作られる → その中の bin/python は brew 版の python にリンクされる

実行した python バージョンに紐づく環境が作られるので、
標準インストール版の Python で venv 作成したい場合は、こう。

bash
/usr/bin/python3 -m venv system-3.9.3

自分的命名ルール

分からなくなるので、当面はこのルールにしてみる。

プロジェクト内の場合

  • .venv という名前で作る

共通のディレクトリの場合

  • ~/python-venvs/[どこのパッケージ管理のpythonか]-[pythonバージョン]-[識別名(あれば)]

例:

  • system-3.9.3
  • brew-3.13.3
  • pyenv-3.11.9-conf-1
  • pyenv-3.11.9-conf-2

アクティベートする (切り替える=スクリプト読み込む)

切り替え前

bash
which python3  # /opt/homebrew/bin/python3 だとする
python3 -V # 3.13.3 だったとする

切り替え(アクティベート)

. ~/python-venvs/system-3.9.3/bin/activate


実行ではなく、読み込みなので注意

→ 切り替わったことを確認

bash
which python3  # ~/python-venvs/system-3.9.3/bin/python3 になった
python3 -V # 3.9.3 になった

→ 以降、pip でライブラリをインストールしたら venv 以下に保持される

デアクティベート(抜けるコマンド)

deactivate
bash
which python3  # /opt/homebrew/bin/python3 に戻ってる
python3 -V # 3.13.3 に戻ってる

バージョン確認

いま設定されている venv を確認 (terminalから)

echo $VIRTUAL_ENV

いま設定されている venv を確認 (コードから)

py
python3 -c "import sys; print(sys.prefix)"

都度アクティベートはめんどくさいので対策 (いずれも非推奨)

スクリプト単位で venv を明示したい

shebang に指定しておけば良さそう(だが、たぶん一般的でない)

py
#!/Users/xxxx/python-venvs/default/bin/python

ただ、このとき、 ~/ といった変数が使えないので、
別ユーザとスクリプトを共有する場合は共通のディレクトリを明示する必要がありそう

デフォルトで使われる venv を .zshrc に設定入れておく

これは やってはダメ

これをやってしまうと、切り替えたくても毎回 同じ環境を向いてしまうことになって、
ハマる原因を作るだけになるので、やめておく。

.zshrc
. ~/python-venvs/default/bin/activate