Poetryを使ったPythonパッケージの開発環境で、そのパッケージをその開発環境にEditable(編集可能)インストールする方法に関するメモです。(筆者の理解が間違っている恐れがあります。)
“poetry install” コマンドでEditableインストールされる
Poetryでは以下のコマンドで、その開発中のパッケージをEditableインストールできます。
poetry install
このinstallコマンドはそのPoetryプロジェクトの開発環境の依存関係を仮想環境にインストールするものであり、このときそのPoetryプロジェクトのパッケージはEditableインストールされます。
参考 : https://python-poetry.org/docs/basic-usage/#installing-dependencies-only
The current project is installed in editable mode by default.
https://python-poetry.org/docs/basic-usage/#installing-dependencies-only
参考 : https://stackoverflow.com/questions/73499000/poetry-analog-to-pip-install-e
なぜこのコマンドひとつをメモとしてこの記事にしたか、という動機については蛇足として以下に記載します。
Editableインストールしたい理由
Poetryはパッケージを作るための便利ツール
個人的にこれまでPoetryを単なる仮想環境だと理解しており「Poetryで仮想環境を作れて、環境が汚れなくて幸せ」くらいにしか考えておらず、仮想環境はvenvでも実現できますのでPoetryの恩恵をそれほど受けられていなかったと思います。
最近になって自作パッケージをちゃんと作ろうということを思い立ちPythonパッケージのディレクトリ構造や効率よく開発するための方法について調べていたところ、Poetryがパッケージ開発に使えるツールであり、「Poetryは仮想環境を作れて幸せ」というよりは「パッケージを作る環境として便利で幸せ」という認識になってきました。(この認識が正しいかはわかりません)
srcレイアウトとフラットレイアウト
そして、さらに色々調べるとPythonのプロジェクトを作る際に、そのプロジェクトのディレクトリ構造に「srcレイアウト」と「フラットレイアウト」というものがあることがわかりました。
個人的には今までフラットレイアウトが当たり前だと思ってきたのですが、srcレイアウトはそのパッケージのテストをするためにEditableインストールを強制し、これにより確実にテストをクリアして正しくパッケージ化されていることを確認できる点で利点があるようです。よって、しっかりパッケージを作ろうとした場合にはsrcレイアウトが推奨されているようです。
参考 : https://blog.ionelmc.ro/2014/05/25/python-packaging/#the-structure%3E
ディレクトリ構造自体はPoetryとは直接的な関係はないのですが、「Poetryでプロジェクト管理した上で、推奨されているsrcレイアウトにしたら良いのではないか?」と考えました。
それを踏まえてsrcディレクトリにパッケージがある場合を考えると、何となく「テストコードのインポートPathには”src”が入るの?」と考えましたが、どうやら”src”は入れなくていいようで、そのためにそのテスト(開発)環境にEditableでそのパッケージをインストールする、ということのようです。
(“src”がPathに入るの?という考えは、これまでずっとフラットレイアウトを当たり前だと思い、テストコードも含めてコード上でのimportは全てディレクトリ構造に依存した読み込みが必要になるんじゃないか、という考えによるものです。しかし必ずしもそうでは無いらしい。)
Editableインストールってなに
Editableインストールとは、開発中のパッケージをEditableインストールすると、そのパッケージに変更を加えた際には改めてそのパッケージをインストールし直さなくてもその変更が適用されるインストール方法だそうです。
pipでインストールする場合には以下のようにオプション付きでコマンドを実行します。
pip install -e example_package
参考 : https://pip.pypa.io/en/stable/topics/local-project-installs/#editable-installs
ここで、「それで、Poetryでsrcレイアウトでパッケージを作りたいんだけど、Poetryを使った環境にはEditableインストールってどうするの?」という疑問がわいたため調べてみました。すると、前述のようにPoetry環境ではinstallコマンドによってEditableインストールされるということでした。
これにより、開発環境のルートディレクトリでテスト(Pytest)を実行すると、EditableインストールされたパッケージにPathが通り、そのインストールされたパッケージをテストできるということです。
Pytestのドキュメントにもsrcレイアウトをつかったテスト方法について書かれていました。
参考 : https://docs.pytest.org/en/latest/explanation/goodpractices.html#choosing-a-test-layout-import-rules
ということで、Poetryプロジェクトでsrcレイアウトで”poetry install”コマンドを使えば便利にパッケージを開発できそうです。
今回の記事は「Poetry環境でEditableインストールする方法」ただひとつにフォーカスして、なぜEditableインストールしたかったのかという理由を遡る形でメモとして記載しましたが、後日改めて「Poetryを使ってパッケージ開発からテストを行う」という視点でまとめたいと考えています。
コメント