こんにちは 株式会社インゲージの機械学習エンジニアの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 hoge
でhoge
という名前のプロジェクト(≒仮想環境)を作成、そのディレクトリ内で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
とすることで新規に作成したプロジェクトがデフォルトでシステム環境のパッケージを使用できるようになります。