ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Raspberry Pi】pip installを使えるようにする

 以前Raspberry Pi 5の環境構築に関する記事を書きました。

 その後色々調べていると、どうやらデフォルトの状態ではpipでのインストールができないということを知ったので、それを解決するための備忘録になります。

 詳しくは参考資料に挙げているページ様を参照してください。


 では、始めます。


0:デフォルトの状態でpip installをしてみる
 Raspberry Pi 5にRaspberry Pi OS(64bit)を入れた状態で、以下のようにpipからOpenCVを入れるコマンドを実行してみます。

pip install opencv-pyhton

 すると以下のようなエラーが出てインストールが実行されません。

$ pip install opencv-pyhton
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.

    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.

    For more information visit http://rptl.io/venv

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

 これはどうやらpip 23から導入された「PEP668」というのが原因らしく、要は「仮想環境以外でpip installをできないようにする」対応だそうです。
 とりあえず現状そのままのコマンドだと動かないので、使えるようにしていきます。


1:ちゃんとした対応方法
 正式?な対応方法を最初に書いておきます。

 まず最初にpip installするプロジェクトのディレクトリを作成します。ディレクトリ名はなんでもよいですがここでは「test_pip」として話を進めます。

mkdir test_pip

 pip installするプロジェクトディレクトリを作成したら、そのディレクトリに移動します。

cd test_pip

 対象ディレクトリに移動したら、以下のコマンドを実行します。「'test_pip'」の部分は対象ディレクトリの名前に各自修正してください。

python -m venv --system-site-packages --clear --prompt 'test_pip' --upgrade-deps $(pwd)/.venv

 このコマンドは1分ほど時間がかかるので、終了するまで待ちます。

 終了すると対象ディレクトリ内に「.env/bin/」のフォルダができています。その中にpipやpythonなどが入っているかを以下のコマンドで確認します。

ls .venv/bin/

 自分の場合は実行すると以下のようにちゃんとpipとpythonが入っていました。

$ ls .venv/bin/
Activate.ps1  activate  activate.csh  activate.fish  pip  pip3  pip3.11  python  python3  python3.11

 これでプロジェクトのディレクトリ内の仮想環境の準備ができたので、以下のコマンドで仮想環境を適応させます。

source .venv/bin/activate

 仮想環境を適応させると、以下のように「(プロジェクト名)」がユーザ名などの前につくようになります。

(test_pip) $

 この状態で「command -v python」で仮想環境に入っているpythonを確認すると、仮想環境下でのpythonが使われていることがわかります。

/test_pip/.venv/bin/python

 この状態であれば「pip install」コマンドや「pip install -r requirements.txt」も実行できるようになっています。

 仮想環境から抜ける場合は以下のコマンドで抜けることができます。

deactivate

 つまりは「source .venv/bin/activate」コマンドで仮想環境を読み込み、その状態でpip installを実行し、deactivateで仮想環境から抜けるという形になります。


2:手っ取り早く解決する方法
 1の方法が一番望ましい方法だと思いますが、一応強制的にpip installできるオプションがあります。

 以下のようにコマンドの末尾に「--break-system-packages」を付けるだけです。

pip install [パッケージ名] --break-system-packages

 ちなみにuninstallする時も同じオプションを付けてあげれば実行できます。

pip uninstall [パッケージ名] --break-system-packages

 ただしこれは強制的に実行しているので、あまり推奨はされないようです。


 以上がpip installを使えるようにする方法になります。


 今回はRaspberry Pi 5での方法でしたが、pip 23以降のバージョンでは起こり得る可能性があるので知っておくと良いかもしれません。


・参考資料