WindowsにpipxをインストールしてPythonアプリを管理してみる

Pythonの便利なコマンド、パッケージなどアプリをインストールする際に、どこにインストールしてどのように管理するかは悩む部分かと思いますが。

pipxを利用するとこれらをいい感じに隔離した環境にインストールして管理してくれるようです。

ここではWindows環境にpipxをインストールして、パッケージをインストールして管理してみます。

## 本記事で利用している環境

- Windows 23H2
- Python 3.12.1
- pip 24.0

## ドキュメントなど

- [github - pypa/pipx](https://github.com/pypa/pipx)
- [pipx](https://pipx.pypa.io/stable/)

## 前提条件の確認

[Installation System Requirements](https://pipx.pypa.io/stable/installation/#system-requirements)

2024年5月現在、python 3.7以上を利用する必要があるようです。

またpipを利用したインストールでは、pipのバージョンはrequires pip 19.0 or laterとなっていました。

## Windowsにpipxをインストールする

- [Installation On Windows](https://pipx.pypa.io/stable/installation/#on-windows)

Windowsでのpipxを利用するには、下記の3種類があるようです。

- Scoopを利用してインストール
- pipを利用してインストール
- インストールせずにzipappで利用

今回はpipを利用してインストールしてみます。

```powershell
# If you installed python using Microsoft Store, replace `py` with `python3` in the next line.
py -m pip install --user pipx
```

上記コマンドを実行してインストールします。

Windowsのpy.exe（pythonランチャー）を利用し、-mオプションでモジュールとして `pip install --user pipx`を実行しています。

- [ユーザサイトへインストールする](https://packaging.python.org/ja/latest/tutorials/installing-packages/#installing-to-the-user-site)
- [User Installs](https://pip.pypa.io/en/stable/user_guide/#user-installs)

pipの-userオプションを利用するとインストールするパッケージを、現在のユーザーだけが使えるようにpipxをインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/7807721b-5686-253d-f60e-02c0b7d3e5bb.png)

-userオプションを利用しているので、ユーザーディレクトリ配下の`\AppData\Roaming\...\Scripts`にインストールされました。

画像ではWarningが出ていますが、今回利用する環境では該当ディレクトリに環境`PATH`を通していないので警告がでているようです。

ドキュメントではWarningが出た場合、記載されているパスに移動して下記のコマンドを実行とあるので実行します。

```PowerShell
# Warning に記載のあるパスに移動してからコマンドを実行
.\pipx.exe ensurepath
```

コマンドを実行すると環境変数PATHに該当のディレクトリが登録されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/d9a40ef6-ca56-3ba1-aaf7-e2e433d948c1.png)

プロンプトを再起動して環境変数を読み込み直すと、インストールしたpipxにPATHが通っている事がわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/98f0a919-7b98-d3cf-15db-c1a52c38136c.png)

## pipxでpycowsayをインストールして実行してみる

```powershell
# pipxで管理されているパッケージがない事を確認
pipx list

# pycowsayをインストール
pipx install pycowsay

# pipx listでインストールされた事を確認
pipx list

# pycowsayを実行
pycowsay moooo!
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/f1b8acac-0234-ee1a-fd72-551231c03c41.png)

## pipx runではインストールしないでも実行できる

pipx runコマンドを実行すると、インストールせずとも一時的な仮想環境を用意して実行してくれます。

```powershell
pipx run pycowsay moooo!
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/35d04336-14a0-051e-8420-c9157c96ddf3.png)

実行した環境では先ほどpycowsayがインストールされているため、すでにインストールされている旨メッセージがでてしまっていますがpycowsayが実行されました。

## pipx uninstallでアンインストール

pipxのuninstallオプションでアンインストールする事ができます。

```powershell
pipx list

pipx uninstall pycowsay

pipx list
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/97e06cf9-8b30-84a0-289c-681db0d5a9da.png)

## pipxでインストールすると何がよいのか

- [Overview: What is pipx?](https://pipx.pypa.io/stable/#overview-what-is-pipx)
- [How pipx works](https://pipx.pypa.io/stable/how-pipx-works/)
- [Comparison to Other Tools](https://pipx.pypa.io/stable/comparisons/)
- [Example](https://pipx.pypa.io/stable/examples/)

pipに比べて、pipxはインストールしたアプリごとに隔離した環境を用意してインストールされるようです。

アプリケーションごとに、隔離した環境を用意しているため、パッケージの一覧表示やアップグレード、アンインストールなどでメリットがあります。

またpipxはsudoを必要としなかったり、runオプションで一時的に実行できたり、特定のバージョンを指定して簡単に実行できたり。

色々と享受できるメリットがあります。

## verboseオプションを付けてどんな感じでpipxがどんな感じで動いているのか

- [How pipx works](https://pipx.pypa.io/stable/how-pipx-works/)

上記ページでpipxの仕組みについて記載があります。

インストール時に、--verboseオプションをつけてインストールしてみると。

裏ではどのインタープリターを利用しているかや、venvを利用して仮想環境を生成しているのが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/0393a36e-7236-d16c-afd1-7c136c9df576.png)

## インストールされる場所と仮想環境の場所について

- [Installation Options](https://pipx.pypa.io/stable/installation/#installation-options)

pipxのデフォルト設定では、バイナリは'~\.local\bin'にインストールされ、仮想環境は`~\pipx\venvs`に構築されていました。

ちなみにここらへんのパスについては、バージョン1.2.0で変更になっているようです。

以下、[Installation Options](https://pipx.pypa.io/stable/installation/#installation-options)のNoteより引用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/479133e3-2266-7cdd-72d7-92fca6a7ce7a.png)

## pipx-in-pipx

pipxは適宜仮想環境を作成してインストールしてくれるツールとなりますが、紹介した手順ではpipx自体はpipでインストールしています。

公式ドキュメントではpipxをpipxでインストールする事は推奨されてはいませんが、これをやりたい場合は下記のプロジェクトが紹介されていました。

> It is not recommended to install pipx via pipx. If you'd like to do this anyway, take a look at the pipx-in-pipx project and read about the limitations there.

- [mattsb42-meta / pipx-in-pipx](https://github.com/mattsb42-meta/pipx-in-pipx)

## 総評

ツールごとに仮想環境を構築したり、インストールだったりアンインストールだったり。
ただツールを使いたいだけなのに、環境の管理をどうするか悩んだりすることがありますが。

pipxを利用すると、そこらへんの管理をpipxが受け持ってくれるので本来利用したかったツールを悩まずに便利に利用できます。