SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

WSL2:UbuntuのPythonで「pip install」する前に知るべきこと

目次

WSL2:UbuntuPythonで「pip install」する前に知るべきこと

Windows11のWSL2:Ubuntu20.04LTSに、Pythonの開発環境をうつしていってます。

今回は、パッケージ管理に使うコマンド「pip」に関して、Windowsと違って注意しなければいけないことがあるよ・・という話題です。

標準では「pip」はインストールされていません

標準のままでWindowsターミナルのWSL2:Ubuntuシェルで「pip」とうつと以下のメッセージが表示されます。

Command 'pip' not found, but can be installed with:sudo apt install python3-pip

そう、Python3は標準ではいっているのに「pip」は標準ではいっていません。

パッケージ管理で「apt」と「pip」の混同は危険です

調べてみると、このような記事がありました。

www.python.jp

ポイントを引用します。

通常、Ubuntuの実行環境は apt コマンドで操作しますが、pip コマンドでPyPIなどからのパッケージをインストールすると、Ubuntuのパッケージ管理に不具合が発生する可能性があります。通常は、pip コマンドではなく、apt コマンドを使って、Ubuntuのパッケージ管理の仕組みを使ってパッケージを更新するようにしましょう。

まさにひとつの答えがここにありました。

確かに「apt」と「pip」ではパッケージ管理の細かい仕様が異なりますから、混在させることで問題が発生するのは理解できます。

でも。

pipは使うべきでないのか?

pipを使わないとしたら、pythonのパッケージ追加はどうしたらいいのか?

そこを確認する必要があります。

pipはsudo付きで実行してはいけない

pipコマンドでUbuntuのパッケージ管理に問題があるのは、「apt」と「pip」が同じレベルでパッケージを更新したときだけです。

なので、「sudo pip」みたいに特権ユーザで「pip」を使ったときだけが問題です。

その観点で調べると、こちらのページに答えがありました。

fedoraproject.org

このような記述がありました。

Never ever ever ever use pip or pip3 with sudo. Use pip --user or Python virtual environments instead.

決してsudoでpipやpip3を使ってはいけません。代わりにpip --userやPython仮想環境を使ってください。

pip --userやPython仮想環境を使うということは、「/home/<user>/.local/」以下のユーザ個別ディレクトリにインストールされるようにしろということです。

実は、Ubutuでは特権ユーザ以外だと「--user」が強制されるようになっています。

sudoなしで「 pip install 」を実行してもホームディレクトリの ~/.local ディレクトリにインストールする「安全性の高いpip」なのです。

結論:非特権ユーザで「pip」を使いましょう

結論としては、僕みたいに。

  • WSL2上のUbuntuを使っている
  • pyenvやpipenvは導入しない
  • 個人的な開発環境としてのみ使っている

この前提なら、Pythonのライブラリパッケージをホームディレクトリ以下にインストールするのが正解だということです。

Ubuntuでは非特権ユーザでpipを実行すると「--user」付きと同じ動作をしますので、「--user」オプションはありません。

なので、WSL2:Ubuntuで普通に「pip install」をすれば良くて、「sudo」をつけなければ、pipは普通に使っていい・・ということです。

ただし、pathを通すのは忘れずに

ひとつだけ注意が必要なことがあります。

pipでインストールするPythonのパッケージには「autophp8」みたいな実行モジュールもあることです。

なので「/home/<user>/.local/bin」がPATHに追加されている必要があります。

実は「.profile」に以下の記述がすでに記載されています。

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

なので、何もしなくても大丈夫だろうと思っていたのですが、VsCodeのターミナルから使ったときとか、微妙にうまくいかないケースがあったので、僕は「.bashrc」に以下を記載して対応しました。

export PATH=$PATH:$HOME/.local/bin

気をつけれるのは、そのくらいかと思います。

さて。

ぐるぐる回って、振出しに戻ったみたいなオチになりました。

でも、なんとなく使ってると、うっかり「sudo pip」なんて・・いかにもやってしまいそうですから、事前に調べられたのはよかったと思います。

ではでは。