Ubuntu 24.04 環境での pip install 仮想環境推奨の回避策

# はじめに

こんにちは、しゅんです。  
Ubuntu 24.04を使い始めて最初に直面したのが、Pythonパッケージのインストールに関する問題でした。`pip install numpy`を実行するだけで、以下のエラーが発生します。

```bash
error: externally-managed-environment

× This environment is externally managed
╰──> To install packages in this environment, you need to explicitly opt in by using the `--break-system-packages` option.
```

Ubuntu 24.04では仮想環境の使用が推奨されており、システム全体に直接パッケージをインストールするには追加のオプションが必要です。しかし、毎回 `--break-system-packages` を入力するのは正直面倒ですし、大規模なライブラリ（例えばPyTorch）を繰り返しインストールするたびに容量が圧迫されていきます。

そこで、この問題を解決するためにシェルスクリプトを使って作業を効率化しました。その手順をこの記事で共有します。

---

### 背景と問題点

Ubuntu 24.04でのPythonパッケージ管理には以下の課題があります：
1. **エラーメッセージの頻発**: 簡単なコマンドでさえ、追加オプションが必要になる。
2. **手間の増加**: `--break-system-packages` を毎回指定するのは煩雑。
3. **容量問題**: 仮想環境を複数作成するとストレージを圧迫。

このスクリプトを設定することで、これらの問題を一気に解消できます。

---

### 手順概要

1. **シェルスクリプトを設定**: `pip`コマンドをラップして、`pip install`時に自動で`--break-system-packages`を追加。
2. **設定を反映**: `.bashrc`または`.zshrc`に追記し、環境に適用。
3. **動作確認**: 実際にインストールコマンドを試す。

以下、詳細な手順を説明します。

---

### 設定手順

#### 1. シェル設定ファイルを編集

使用しているシェルに応じて、次のコマンドを実行して設定ファイルを開きます：

- Bashの場合：
  ```bash
  nano ~/.bashrc
  ```

- Zshの場合：
  ```bash
  nano ~/.zshrc
  ```

#### 2. カスタム関数を追加

以下のスクリプトを設定ファイルにコピー＆ペーストしてください：

```bash
function pip() {
    # 引数が空の場合、または `pip --version` などの場合はそのまま実行
    if [ $# -eq 0 ]; then
        command pip
        return
    fi

    local subcmd="$1"
    shift

    # pip install の場合にのみ --break-system-packages を追加
    case "$subcmd" in
        install|uninstall)
            command pip "$subcmd" "$@" --break-system-packages
            return
            ;;
        *)
            # それ以外のサブコマンドではそのまま実行
            command pip "$subcmd" "$@"
            return
            ;;
    esac
}

function pip3() {
    # 引数が空の場合、または `pip3 --version` などの場合はそのまま実行
    if [ $# -eq 0 ]; then
        command pip3
        return
    fi

    local subcmd="$1"
    shift

    # pip3 install の場合にのみ --break-system-packages を追加
    case "$subcmd" in
        install|uninstall)
            command pip3 "$subcmd" "$@" --break-system-packages
            return
            ;;
        *)
            # それ以外のサブコマンドではそのまま実行
            command pip3 "$subcmd" "$@"
            return
            ;;
    esac
}
```

#### 3. ファイルを保存して反映

保存後、以下のコマンドを実行して設定を反映します：

- Bashの場合：
  ```bash
  source ~/.bashrc
  ```

- Zshの場合：
  ```bash
  source ~/.zshrc
  ```

---

### 動作確認

以下のコマンドを実行して、`--break-system-packages`が自動で付加されることを確認してください：

```bash
pip install numpy
```

実際には以下のように実行されます：
```bash
command pip install numpy --break-system-packages
```

**なお、このスクリプトは`pip install`と`pip uninstall`サブコマンドのみに反応します。他のサブコマンド（例：`pip list`, `pip freeze`）には影響を与えません。**

こんな感じです

```bash
syun@syun:~$ pip install pandas
Defaulting to user installation because normal site-packages is not writeable
WARNING: Skipping /usr/lib/python3.12/dist-packages/pybind11-2.11.1.dist-info due to invalid metadata entry 'name'
Collecting pandas
  Using cached pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (89 kB)
Requirement already satisfied: numpy>=1.26.0 in /usr/lib/python3/dist-packages (from pandas) (1.26.4)
Requirement already satisfied: python-dateutil>=2.8.2 in /usr/lib/python3/dist-packages (from pandas) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /usr/lib/python3/dist-packages (from pandas) (2024.1)
Requirement already satisfied: tzdata>=2022.7 in ./.local/lib/python3.12/site-packages (from pandas) (2024.2)
Using cached pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (12.7 MB)
WARNING: Skipping /usr/lib/python3.12/dist-packages/pybind11-2.11.1.dist-info due to invalid metadata entry 'name'
Installing collected packages: pandas
Successfully installed pandas-2.2.3
syun@syun:~$ pip uninstall pandas
Found existing installation: pandas 2.2.3
Uninstalling pandas-2.2.3:
  Would remove:
    /home/syun/.local/lib/python3.12/site-packages/pandas-2.2.3.dist-info/*
    /home/syun/.local/lib/python3.12/site-packages/pandas/*
Proceed (Y/n)? Y
  Successfully uninstalled pandas-2.2.3
syun@syun:~$ 
```

---

### 終わりに

これで、Ubuntu 24.04でも快適にPythonパッケージをインストールできるようになります。  
仮想環境を使わずに済むこの手法が、皆さんの開発効率を向上させる一助になれば幸いです！