はじめに
こんにちは、しゅんです。
Ubuntu 24.04を使い始めて最初に直面したのが、Pythonパッケージのインストールに関する問題でした。pip install numpy
を実行するだけで、以下のエラーが発生します。
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パッケージ管理には以下の課題があります:
- エラーメッセージの頻発: 簡単なコマンドでさえ、追加オプションが必要になる。
-
手間の増加:
--break-system-packages
を毎回指定するのは煩雑。 - 容量問題: 仮想環境を複数作成するとストレージを圧迫。
このスクリプトを設定することで、これらの問題を一気に解消できます。
手順概要
-
シェルスクリプトを設定:
pip
コマンドをラップして、pip install
時に自動で--break-system-packages
を追加。 -
設定を反映:
.bashrc
または.zshrc
に追記し、環境に適用。 - 動作確認: 実際にインストールコマンドを試す。
以下、詳細な手順を説明します。
設定手順
1. シェル設定ファイルを編集
使用しているシェルに応じて、次のコマンドを実行して設定ファイルを開きます:
-
Bashの場合:
nano ~/.bashrc
-
Zshの場合:
nano ~/.zshrc
2. カスタム関数を追加
以下のスクリプトを設定ファイルにコピー&ペーストしてください:
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の場合:
source ~/.bashrc
-
Zshの場合:
source ~/.zshrc
動作確認
以下のコマンドを実行して、--break-system-packages
が自動で付加されることを確認してください:
pip install numpy
実際には以下のように実行されます:
command pip install numpy --break-system-packages
なお、このスクリプトはpip install
とpip uninstall
サブコマンドのみに反応します。他のサブコマンド(例:pip list
, pip freeze
)には影響を与えません。
こんな感じです
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パッケージをインストールできるようになります。
仮想環境を使わずに済むこの手法が、皆さんの開発効率を向上させる一助になれば幸いです!