Q: poetryとは
A: poetryはpythonの仮想環境を作成するツールの1つです。
Q: 他にたくさんある仮想環境との違いは?
他の仮想環境のツールとの違いに触れる前に、poetry以外にも多くの仮想環境があるため、それらについてあらましを説明します。
pythonの仮想環境ツール一覧
virtualenv
PyPIの歴史は古く、2007年にIan Bickingという人が開発したものです。
その後も改良が重ねられ、直近では2023年4月28日にバージョンアップが行われています。
virtualenvはPython2の環境との互換性があるため、レガシーなPython環境と新しいPython環境が入り交じるような場面で現在でも使用されています。
venv
venvはPython3.3以降で標準ライブラリの一部として導入された仮想環境ツールです。
venv自体はvirtualenvの影響を大きく受けて、Pythonの標準ライブラリの一部として採用されたものになります。
Python環境の分離のための軽量なツールという位置づけられ、手軽に仮想環境の作成や管理が可能になりました。
ただPython3.3以降に実装だれている事から分かるようにPython2系との互換性はありません。
conda
condaは、Anacondaで有名でご存じの方も多いかと思います。
AnacondaナビゲーターのようなGUIを提供していたりと特徴的なツールです。
元々データサイエンス、機械学習、大規模データ処理、予測分析・・etcのために作られたPython・R言語向けのツールです。
ただ、利用規約の改定により個人でも商用での利用は有償となっているいるようで、最近利用者が離れつつある印象です。(非商用であれば個人でも無償で利用出来ます)
pipenv
pipenvは2017年頃、Kenneth Reitzという人が開発した仮想環境のツールです。ただ、現在PyPIを参照すると、作者が「Pipenv maintainer team」となっているため、何らかの理由で作者の座からおりたのかも知れません。
pipenvは、依存関係の管理や仮想環境の機能を"Pipfile"によって一元化することで、Pythonプロジェクトの開発プロセスを簡単にしようというコンセプトで開発されたものです。
poetry
今回取り扱う”poetry”ですが、こちらは2018年頃に”Sébastien Eustace”という人により開発された仮想環境ツールです。Pythonプロジェクトの依存関係管理、仮想環境の作成、パッケージのインストールとアップデート、そしてパッケージ化と配布を一元化して行う機能を提供し、Pythonプロジェクトの開発・配布を容易にするというコンセプトで開発されたものです。
pyenv
pyenvをここで取り上げていいかどうかは微妙ですが、説明の都合もあるため取り上げます。
pyenvは2012年にYamashita, Yukiという人によって開発されたもので、本来はPythonのバージョン管理ツールです。ですが、pyenv-virtualenvというプラグインを利用することで仮想環境の管理も行えるようにもなります。複数のPythonのバージョンをシステムにインストールし、プロジェクトごとに使用するPythonのバージョンを切り替えることができます。pyenvのバージョン管理機能の特徴は、システムにインスールされてないバージョンのpythonであってもpythonの公式サイトからダウンロードして自動的にインストールしてくれる点です。
追記:pyenv自体はmacOSとLinuxに対応するのみで、WSL(Windows SubSystem For Linux)で使用する事は出来ますが、Linuxの仮想環境の中で動作するのみ為、Windows固有の機能にアクセス出来ません。
Windows環境で同様の機能を使用する場合は、pyenv-winというpyenvからフォークしたリポジトリを使用します。僕はWinodws環境で開発をすることが多いので、次回以降投稿する記事ではWindowsに対応したpyenv-winが中心になります(一応pyenvでの動作についてもフォローはするつもりです)。
結局なにが何だって?
poetryとその他の仮想環境のツールを比較する上で、パッケージ管理システムとして何が使われているかで分けるには1つの視点になります。
現在pythonでモジュール(パッケージ)インストールしたりアンインストールするさいpipを利用する方は多いのではないでしょうか?
逆にpip使わなくてどうやってモジュールなんてインストールするの?と思われるかも知れません。
ただ、モジュール管理に使用されるのは決してpipだけではないありません。
pipを使用してモジュール(パッケージ)の管理を行う、または行う事が出来るのは以下の仮想環境ツールです。
- virtualenv
- venv
- pipenv
- poetry
- pyenv
上記のうちpipコマンドを使うことは出来るものの、pipコマンド使用すると本来その仮想環境ツールが想定している使用方法の趣旨から外れるため、pipコマンドの利用が推奨されていないものは以下になります。
3. pipenv
4. poetry
この2つの仮想環境ツールは元来非常に似通ったもので、pipenvとpoetryの大きな違いは以下の2点です。
-
依存関係の解決速度
-
当該仮想環境ツールに、パッケージのビルドとリポジトリへの公開を行う機能が含まれるかどうか。
-
の依存関係の解決速度については、poetryの方が早いとも言われますがあまり大きな差があるかどうかは微妙なようです。
-
の仮想環境ツールに、パッケージのビルドとリポジトリへの公開を行う機能が含まれるかどうかですが、これはpoetryにはその機能があり、pipenvにはその機能がありません。
総論
自分はパッケージのビルドとか公開なんかしないから関係ない、という方も多いと思いますが、使用する側から見て関係なくとも、Githubなどでリポジトリを公開する立場からすると大きな違いになります。
昨今、大規模言語モデルや自然言語処理の分野の様々なGithubリポジトリを目にすることが多くなりました。
それらのリポジトリの多くはpoetryが使用されています。
頻繁にパッケージをビルドしたりリポジトリを公開する側の手間を考えるとこの差は大きいためです。
また、頻繁に公開または更新されるリポジトリでは、Pythonのバージョンとの兼ね合いも問題化する事が多くあります。
そのためpythonのバージョンそのものを管理できるpyenvとpoetryの組み合わせた使用方法を知っていることで、昨今のリポジトリや、公開されているソースコードがPythonのバージョンや、モジュールの依存関係の問題で動作しない、という悩ましさから解放される点は多いと思います。
念のため本記事では、どの仮想環境ツールが優れているといった優劣のお話しは一切しませんが、poetryやpyenvの基本的な使用方法について、今後の記事で、自分が覚えたことの備忘録もかねて、少しずつ公開していこうと思います。