😸

Pythonの仮想環境を自動で切り替えるシェルスクリプト

2025/02/06に公開

はじめに

Pythonで開発をしていると、プロジェクトごとに異なる仮想環境(venv)を使用することが一般的です。しかし、ディレクトリを移動するたびに手動で仮想環境を切り替えるのは面倒です。今回は、ディレクトリの移動時に自動的に仮想環境を切り替えるシェルスクリプトを紹介します。

スクリプトの機能

  • ディレクトリ移動時に自動的に仮想環境を検出
  • 既存の仮想環境を非アクティブ化して新しい環境に切り替え
  • カラー付きの分かりやすいステータス表示
  • Bash/Zsh両対応

コード

function auto_activate_venv() {
    # カラーコードの定義
    local GREEN='\033[0;32m'
    local YELLOW='\033[0;33m'
    local NC='\033[0m' # No Color (リセット)

    # 現在のvenv環境を非アクティブ化
    if [[ -n "$VIRTUAL_ENV" ]]; then
        local current_venv=$(basename "$VIRTUAL_ENV")
        deactivate
        echo -e "${YELLOW}Deactivated virtual environment: ${current_venv}${NC}"
    fi

    # venvディレクトリを探索
    local venv_paths=("./venv/bin/activate" "./.venv/bin/activate" "env/bin/activate")
    
    for venv_path in "${venv_paths[@]}"; do
        if [[ -f "$venv_path" ]]; then
            source "$venv_path"
            echo -e "${GREEN}Activated virtual environment: $(basename $(dirname $(dirname $venv_path)))${NC}"
            return
        fi
    done
}

# cdコマンドのオーバーライド
function cd() {
    # 元のcdコマンドを実行
    builtin cd "$@"
    
    # 移動先のディレクトリでvenv環境をチェック
    auto_activate_venv
}

# プロンプトの設定
if [[ -n "$ZSH_VERSION" ]]; then
    # ZSH用の設定
    setopt PROMPT_SUBST
    PS1='${VIRTUAL_ENV:+($(basename "$VIRTUAL_ENV")) }'"$PS1"
else
    # Bash用の設定
    PS1='${VIRTUAL_ENV:+($(basename "$VIRTUAL_ENV")) }'"$PS1"
fi

セットアップ方法

  1. お使いのシェル設定ファイル(.bashrcまたは.zshrc)に上記のコードを追加します。
  2. シェルを再起動するか、以下のコマンドを実行します:
    # Bashの場合
    source ~/.bashrc
    
    # Zshの場合
    source ~/.zshrc
    

使用方法

セットアップ後は特別な操作は必要ありません。cdコマンドでディレクトリを移動すると、自動的に以下が実行されます:

  1. 現在アクティブな仮想環境がある場合は非アクティブ化(黄色のメッセージで通知)
  2. 移動先のディレクトリで仮想環境を検索
  3. 仮想環境が見つかった場合は自動的にアクティブ化(緑色のメッセージで通知)

動作例

$ cd ~/projects/project-a
Activated virtual environment: venv

$ cd ~/projects/project-b
Deactivated virtual environment: venv
Activated virtual environment: .venv

カスタマイズ

メッセージの色を変更したい場合は、以下のカラーコードから選択できます:

BLACK='\033[0;30m'
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[0;37m'

まとめ

このスクリプトを使用することで、Pythonプロジェクト間の移動がよりスムーズになり、仮想環境の切り替えを意識する必要がなくなります。開発効率の向上に役立つはずです。

その他の記事紹介

これ以外にも以下のようなPythonの開発に役立つシェルスクリプトを紹介しています。

Discussion