[初心者向け]Pythonのプロジェクト管理ツールを使う理由とツールの種類

## 対象読者

- Python初学者
- 環境構築とか、仮想環境とかよく分からない人

## なぜプロジェクト管理ツールを使うのか

プログラミングの勉強をしているときは、Pythonプロジェクト管理ツール(ここではPythonのバージョン管理と仮想環境管理をするツールを示します)のことを全く気にしていませんでした。他の人と共同開発するわけではないし、開発期間も短いのでバージョンの変更で苦しむこともありません。
しかし実際に仕事をしたり、仕事を依頼する際にはプロジェクト管理をしっかりしていないと、全く仕事が進まなくなってしまいます。この段階にきて、プロジェクト管理ツールの大切さを理解して手をつけましたがあくまでなんとなくでした。

今まではwindows環境でcondaを、Mac環境でpyenv+poetry でプロジェクト管理を行っていました。
condaは統計や科学系の計算に強く、Rなどの私が以前使用していた言語も使えたので使用していました。condaはPythonバージョン管理とライブラリ管理が一元的に行えて便利でしたが、一部使えないライブラリがあったりして使いづらい部分がありました。
Mac環境でのpyenv+poetryは、当時調べた時にモダンなツールとして出てきたPorteyを勢いで使っただけで仕組みとかをよく考えていませんでした。

最近プロジェクト管理について真面目に考える必要に迫られたりしたので、今新しく自分にとってのスタンダードなプロジェクト管理ツールをどうしようかと思い調べました。

小規模な開発案件ならば問題ないかもしれませんが、モダンなプロジェクト管理ツールは軽量・高速であることが多いようなので、せっかくならばこれからくるツールを初期から使っておいた方が、トータルの学習コストが低いのかなと思います。

## プロジェクト管理ツールは何をするのか

先にも少し触れましたが、Pythonのプロジェクト管理ツールには主に3つの機能があります。

1つ目は、仮想環境の管理です。複数のプロジェクトを並行して開発すると、Pythonのバージョンやライブラリの依存関係を個別に管理する必要があります。そのため、1つのPC上に仮想環境を作成し、その仮想環境内でプロジェクトを開発します。Dockerという似た技術がありますが、Dockerはシステム全体をコンテナという単位で隔離して新しい環境を構築するため、仮想環境とは用途や意味合いが異なります。

2つ目は、Pythonのバージョン管理です。個人で学習しているときはPythonのバージョンをあまり気にしないかもしれませんが、仕事で使う際には非常に重要です。例えば、私がPythonを使い始めた2019年当時は3.8が最新バージョンでしたが、2024年10月時点ではPython 3.13まで進んでいます。この間に、機能や標準ライブラリも大きく変化しています。共同開発を行う際には、プロジェクト内で使用するPythonのバージョンを統一する必要があります。仮想環境を使わずにPythonのバージョンを管理しないと、Pythonのバージョンをアップグレードした際に、過去に作成したコードが動作しなくなる可能性があります。

3つ目は、ライブラリの管理です。pipを使ってライブラリをインストールすると、基本的には依存関係を自動的に解決してくれますが、特定のライブラリのバージョンを変更すると、他のライブラリとの互換性に問題が生じることがあります。ライブラリにはそれぞれ依存関係があるため、バージョン管理は非常に重要です。こうしたライブラリ管理を効率よく行うために、仮想環境を活用することが推奨されます。

## 主なPythonのプロジェクト管理ツール

Pythonのプロジェクト管理ツールとその特徴をまとめました。
古くからあるものは、Pythonのバージョン管理とライブラリの管理が別のツールで行われます。
それがモダンになるに従って、Pythonのバージョン管理とライブラリの管理が統合されたり、依存関係をロックファイルを使用してより強固にしたりしているようです。


| ツール名             | Pythonバージョン管理 | ライブラリ管理（仮想環境管理） | 特徴 |
|----------------------|----------------------|-------------------------------|--------------------------------|
| **venv** (標準ライブラリ) | ×                 | ○                             | Python標準ライブラリに組み込まれている仮想環境作成ツール。簡単で軽量だが、機能はシンプル。|
| **pyenv**            | ○                    | ×                             | システム全体に影響を与えることなく、Pythonの異なるバージョンを切り替えることができるツール。プロジェクトごとに異なるバージョンを使用できます。|
| **virtualenv**        | ×                    | ○                             | 主要な仮想環境管理ツールで、仮想環境を簡単に作成して依存関係を分離できます。古いPythonバージョンにも対応。|
| **pyenv-virtualenv**  | ○                    | ○                             | pyenvとvirtualenvを統合し、バージョン管理と仮想環境管理の両方を一度に行える便利なツール。|
| **conda**             | ○                    | ○                             | Pythonや他の言語のパッケージ管理、依存関係管理に対応したツール。科学計算やデータサイエンスで広く使用されています。|
| **poetry**            | ×                    | ○                             | 仮想環境管理と依存関係の管理を簡単に行えるツール。プロジェクトの依存関係を宣言的に定義し、ロックファイルを生成。|
| **pipenv**            | ○                    | ○                             | Pythonのバージョン管理と依存関係の管理が統合されたツール。ロックファイルを生成し、依存関係の衝突を防止。|
| **Rye**               | ○                    | ○                             | Pythonのバージョン管理と依存関係管理に対応する新しいツール。軽量でシンプルなプロジェクト管理が可能。|
| **uv**                | ○                    | ○                             | Pythonのバージョン管理と仮想環境管理を一つのツールで統合。軽量で、プロジェクトごとに依存関係やバージョンを管理。|
| **Hatch**             | ○                    | ○                             | 仮想環境管理、依存関係管理、ビルド・パッケージングを一元管理できるツール。`pyproject.toml`を使用して設定し、プラグインで機能拡張が可能。|

上記表の中でもRyeとuvは2023年に出てきた新興勢力です。Hatchは2022年に発表されて、その後も定期的に更新されているモダンなものです。この辺りは、Pythonのバージョン管理とライブラリ管理の両方を行える機能を持っており、かつ軽量・高速です。

この辺の違いは調べたのですが、よく分かりませんでした。
さて覇権を取るのはどこでしょうか。

## まとめ

今からpythonのプロジェクト管理を勉強する方は個人的にはRyeかuvがおすすめかなと思います。
（Hatchは使ったことがないので、試してみないと分からないです。）
1つのツールで完結できますし、操作が意外と簡単なことと公式ドキュメントが今っぽく充実しているので勉強しやすいです。

私もRyeとuvが公式ドキュメントを読んで、意外と理解できました。
日本語翻訳はまだ進んでいませんが、翻訳サービスの進歩に感謝です。

Ryeとuvの始め方の記事は別で書いているので、もし興味があったら参考にしてください。

https://qiita.com/The_Past_of_Dice/items/418c1d205dd7463503bd

https://qiita.com/The_Past_of_Dice/items/9230c33404b4c961be59