nikkie-ftnextの日記

イベントレポートや読書メモを発信

pipxで管理するpip-toolsを使って、プロジェクトの仮想環境に依存ライブラリをインストールする(pip-syncの--python-executable引数が必要)

はじめに

🙅‍♂️1 nikkieです

普段Pythonで開発するときはpipのお世話になっていますが、少し前からpipxなるものの存在を耳にしていました。
どんなツールか知ろうと、今回手を動かしています

目次

pipxとは

PyPA(Python Packaging Authority)が開発するツールの1つ

端的に言うと以下のようです

Install and Run Python Applications in Isolated Environments

Python Applications」の部分が最初は分からなかったのですが、どうやら以下のようです(※今の私の理解を書きます)。

  • Pythonを使った開発の中でいろんなパッケージをpip installする
    • 依存するライブラリ(例えば、PyTorch)
    • 開発を円滑にするために使うツール(例えば、taskipy2
  • これらのうち、後者のツールにフォーカスしたのがpipx
  • Python製のCLIアプリケーションをpipxで環境を分けて管理できる(ということらしい)

pipxのインストール(macOS

macOSにはHomebrewでインストールできます4
https://pipx.pypa.io/stable/#on-macos

brew install pipx
pipx ensurepath

pipxでBlackをインストール

pipx installPython製のCLIアプリケーションをインストールできます。
https://pipx.pypa.io/stable/#walkthrough-installing-a-package-and-its-applications-with-pipx

例えばフォーマッタのBlackなら

pipx install black

これでblackコマンドが有効になります。
プロジェクトごとに切る仮想環境にインストールしなくてよいのは嬉しいですね!

pipxでpip-toolsをインストール

先日素振りしたpip-toolsをインストールしましょう。

pipx install pip-tools

実はpip-toolsのドキュメントではpipxを使った動作方法も案内されていました。
https://github.com/jazzband/pip-tools/tree/7.3.0?tab=readme-ov-file#example-usage-for-pip-compile

pip-toolsの使い方は過去の記事があります。

  1. pip-compile
  2. pip-sync

このうちpip-syncにポイントがありました。
--python-executable引数を指定する必要があります!

pip-sync --python-executable $PWD/venv/bin/python

仮想環境(venvディレクトリ)を切っていて、仮想環境の中にrequirements.txtに沿った依存をインストールしたいという状況です。

  • pip-syncは(pipxが管理しているので)、requirements.txtの内容をインストールしたい仮想環境とは別の環境にあります
  • 単にpip-syncだとpip-syncがある環境にrequirements.txtの内容がインストールされます。これは望んでいません
  • そこで--python-executable引数でパッケージをインストールしたい環境のPythonを指定します
    • Custom python executable path if targeting an environment other than current.(pip-sync --helpより)

この引数は以下で知りました。

まとめると、pipxでインストールしたpip-toolsを使うときは

  1. pip-compile
  2. pip-sync --python-executable path/to/python

です。

pipxは高機能!宿題事項列挙

今回はBlackとpip-toolsを入れました。

% pipx list
venvs are in /.../Library/Application Support/pipx/venvs
apps are exposed on your $PATH at /.../.local/bin
manual pages are exposed at /.../.local/share/man
   package black 24.1.1, installed using Python 3.12.1
    - black
    - blackd
   package pip-tools 7.3.0, installed using Python 3.12.1
    - pip-compile
    - pip-sync

pipxはこの2つをそれぞれ別の仮想環境で管理しています。

% ls /.../Library/Application\ Support/pipx/venvs
black       pip-tools

pipxのツールごとの仮想環境について、injectという機能があるみたいです(宿題その1)。
https://pipx.pypa.io/stable/#inject-a-package
ipythonをインストールしたpipxの仮想環境にmatplotlibをインストールするコマンド例があります

また、この記事ではpipx installのみを紹介しましたが、pipx runもあります。
https://pipx.pypa.io/stable/#walkthrough-running-an-application-in-a-temporary-virtual-environment
これはインストールとは趣が違う印象(新概念かも)で、宿題事項その2です。

終わりに

存在だけ聞いていたpipxを触りました。
CLIアプリケーションとして使えるPythonパッケージの管理にフォーカスしています。
Blackなどの開発でお世話になるツール類を、プロジェクトごとの仮想環境に都度インストールしなくて済みそうなのは(特に個人開発で)なかなかよさそうです。

pipx自体は高機能なので、すこーしずつ使える範囲を増やしていきたいですね。


  1. ぶっぶーですわ、ではなく、pipxにちなんでXです。イーロン・マスク氏が大好きなあれですね
  2. ドキュメントには「pipxはPyPIapp storeに変える(it turns Python Package Index (PyPI) into a big app store for Python applications.)」という記載もあります。ref: https://pipx.pypa.io/stable/#where-does-pipx-install-apps-from
  3. https://formulae.brew.sh/formula/pipx