poetryで管理したPoCで重複しがちなパッケージ管理を改善する

こんにちは 株式会社インゲージの機械学習エンジニアのwasatingです。

皆さんpoetry使ってますか?
PoCで様々な環境を作って実験をする際に仮想環境が簡単に作れて、インストールしたパッケージも勝手に管理してくれるので私も大変重宝しています。

が、しかし、何も考えずに1PoC毎に仮想環境を作っていっぱいpoetry add hoge fuga ......なんてしていると思っている以上にストレージを圧迫されてしまいますよね…
しかもそのうちの半分以上は同じパッケージだったりするので無駄が多くなってしまいますね。都度整理しろよと言われたらそれまでなんですが…

そこで今回はどのプロジェクトでも共通して必要なものを、poetryで管理しつつ、いちいちインストールしなくてもいいように環境を作っていきたいと思います。

事前準備

とりあえずコンテナ上でpoetryを使えるようにするところまで行きます。
すでに環境があるよって方は読み飛ばして大丈夫です。

まず最低限必要なイメージを作ります。

mkdir poetry_poc && cd poetry_poc
vim Dockerfile
#Dockerfile
FROM python:3.9.11
RUN apt-get -y update && apt-get install -y --no-install-recommends vim 

ビルドしてコンテナに入ります

docker build -t poetry-poc .
docker run --rm -it poetry-poc bash

次にpoetryをインストールしてPATHを通します。

curl -sSL https://install.python-poetry.org | python3 -
PATH="/root/.local/bin:$PATH"
poetry --version

これでPoetry (version X.Y.Z)と出てくれば無事インストール完了です(X, Y, Zはインストールしたバージョン次第)

各環境の作成

まず、今回はPoC毎に仮想環境を作りたいのでpoetryのconfigを以下のように変更します

poetry config virtualenvs.in-project true

これによって後述する各プロジェクトのディレクトリ下に.venvが作成され、環境が切り分けられるようになります。

ではまず、共通パッケージから作っていきます。
poetryはpoetry new hogehogeという名前のプロジェクト(≒仮想環境)を作成、そのディレクトリ内でpoetry add fugaとすることでfugaというpythonパッケージを、hoge/.venvにインストールすることができます。

しかし、共通パッケージのインストール先は.venvではなく、システム環境のpythonにしたい(理由は後述)ので、まずcommonという名前でプロジェクトを作成します。

cd ~
poetry new common
cd common

ここで、仮想環境を作らず、パッケージをインストール先をシステム環境のpythonにするために事前にconfigを以下のようにして変更します。

poetry config virtualenvs.create false --local

--localを付けることで、現在のプロジェクトに限定してconfigを設定することができます。

あとは好きなパッケージをインストールしていきましょう。とりあえずデモとしてnumpyをいれておきます。

poetry add numpy

これでcommon環境(≒システム環境)にnumpyがインストールされました。

では次にPoC用の環境を作っていきます。プロジェクトの名前はpoc1とします。
先ほど同様に進めていきます。こちらのプロジェクトはとりあえずtqdmをいれます。

cd ~
poetry new poc
cd poc
poetry add tqdm

これで無事pocのプロジェクトが作成され、tqdmがインストールされました。

ではtqdmがちゃんとインストールされているか確認してみましょう

poetry run python -c "import tqdm"

とくにエラーが出なければ無事インストールされています。
なお、poetry shellで仮想環境に入ってからpython -c "import tqdm"でもやっていることは同じです。

さて、無事にpocの環境にパッケージがインストールされましたが、肝心の共通パッケージ(今回はnumpy)はpoc環境からは使えない状態です。
これを解消するため、poc/.venv/pyvenv.cfgを編集します。

vim .venv/pyvenv.cfg

でファイルを開き、

include-system-site-packages = true

としましょう。
この設定によって、システム環境のパッケージも使えるようになります。
つまり、複数のPoCで重複しがちなパッケージはシステム環境にインストールしておくことで、PoC用の仮想環境では必要最低限をインストールするだけで済むようになります!

念のため確認しておきましょう。

poetry run python -c "import numpy"

以上で

  • 共通して使用するパッケージをpoetryで管理しながらシステム環境へインストール
  • PoC毎の環境からシステム環境に入っているパッケージが使える

ことになり、PoC毎にインストールするパッケージの削減に成功しました。

おまけ

今回はデモのためにプロジェクトを作成してからinclude-system-site-packagesをtrueに変更しましたが、

poetry config virtualenvs.options.system-site-packages true

とすることで新規に作成したプロジェクトがデフォルトでシステム環境のパッケージを使用できるようになります。