概要
開発者間で開発環境を合わせようとするときに気を付けるべきこととして、大きく以下の 2 つの事柄があります。
- 言語のバージョン
- ライブラリのバージョン
ここでは、Python で開発をする際に、上記 2 点を整えるためのツールの pyenv*1, virtualenv*2, pipenv*3, poetry*4 の概要を紹介します。
各ツールの対応範囲
各ツールのできることについて、以下の表にまとめます。パッケージは pandas や pytest など、いわゆるライブラリやモジュールと呼ばれる対象を指します。
Python の切り替え | パッケージの切り替え | パッケージのインストール | パッケージのビルド・公開 | |
---|---|---|---|---|
pyenv | ✔ | |||
virtualenv | ✔ | |||
pipenv | ✔ | ✔ | ||
poetry | ✔ | ✔ | ✔ |
対応表からも分かるように、Python のバージョンを整えるツール(pyenv)とパッケージとその依存関係のバージョンを整えるツール(virtualenv, pipenv, poetry)があります。それぞれ役割が異なるため、 pyenv + virtualenv, pyenv + pipenv , pyenv + poetry のように組み合わせて使用されることが多いです。
pyenv の主要操作(Python のバージョン管理)
コマンド | 説明 |
---|---|
pyenv versions | インストール済みの Python のバージョンを表示する |
pyenv install --list | インストール可能な Python のバージョン一覧を表示する |
pyenv install X.X.X | 指定したバージョンの Python をインストールする |
pyenv uninstall X.X.X | 指定したバージョンの Python をアンインストールする |
pyenv global X.X.X | 指定したバージョンの Python をディレクトリに渡って使用できるようにする |
pyenv local X.X.X | 特定のディレクトリ(カレントディレクトリ)でのみ、指定したバージョンの Python を使用できるようにする |
パッケージ管理ツール別の主要操作
仮想環境(シェル)への入り方
ツール | コマンド |
---|---|
virtualenv | source env/bin/activate |
pipenv | pipenv shell |
poetry | poetry shell |
virtualenv を使用する際は、シェルに入る前に以下コマンドで事前に環境を作成する必要があります。
python -m venv env
※ env は任意の名前を指定可能。表の env/bin/activate は上記コマンドを実行した際の例を示す。
パッケージを指定してインストール
tool | command |
---|---|
virtualenv | pip install PACKAGE_NAME |
pipenv | pipenv install PACKAGE_NAME |
poetry | poetry add PACKAGE_NAME |
パッケージを requirements.txt, Pipfile, project.toml からインストール
tool | command |
---|---|
virtualenv | pip install -r requirements.txt |
pipenv | pipenv install |
poetry | poetry install |
パッケージを .lock ファイルからインストール
tool | command |
---|---|
virtualenv | - |
pipenv | pipenv sync |
poetry | poetry install |
Either way, running install when a poetry.lock file is present resolves and installs all dependencies that you listed in pyproject.toml, but Poetry uses the exact versions listed in poetry.lock to ensure that the package versions are consistent for everyone working on your project.
poetry install
コマンドを実行すると .lock ファイルが存在していれば、 .lock ファイルをもとに厳密なバージョンの依存関係をインストールします*5。
pipenv の場合、同等の操作を行いたい場合は pipenv sync
コマンドを使用します。
パッケージと依存関係のアップデート
tool | command |
---|---|
virtualenv | pip install -U PACKAGE_NAME (パッケージ毎にアップデートして requirements.txt を更新する) |
pipenv | pipenv update |
poetry | poetry update |
ツール別のパッケージの管理
インストールすべきパッケージをファイルから読み取り、 install コマンドで一括でインストールすることができます。ファイルは、requirements.txt, Pipfile, pyproject.toml などがあり、ツールごとに名前が異なります。
上記のファイルには、希望するパッケージとそのバージョンを記載します。バージョンは、厳密に指定することもできますし、X.X.X 以上、Y.Y.Y 以下の様な指定も可能です。
以降で示すファイルは、それぞれのツール毎に pytest
をインストールした際の例です。
virtualenv
パッケージは requirements.txt で管理します。
attrs==22.1.0 iniconfig==1.1.1 packaging==21.3 pluggy==1.0.0 py==1.11.0 pyparsing==3.0.9 pytest==7.1.3 tomli==2.0.1
pipenv
パッケージは Pipfile, Pipfile.lock で管理します。
Pipfile
[[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] pytest = "*" [dev-packages] [requires] python_version = "3.8"
Pipfile.lock
{ "default": { ... "pytest": { "hashes": [ "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7", "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39" ], "index": "pypi", "version": "==7.1.3" }, ... }
.lock ファイルとは
全てのライブラリのバージョンを揃えるために作成されるファイルです。
例えば、Pipfile には希望するパッケージとそのバージョンが記載され、Pipfile.lock には実際にインストールされた(依存関係を含む)ライブラリのバージョンが厳密に記載されます。
pipenv sync
を実行する際には、Pipfile.lock ファイルが参照されます。そのため、依存関係を含む全てのライブラリのバージョンを揃えることができます。
poetry
パッケージは pyproject.toml, poetry.lock で管理する。
pyproject.toml
[tool.poetry] name = "project-poetry" version = "0.1.0" description = "" authors = ["name"] readme = "README.md" packages = [{include = "project_poetry"}] [tool.poetry.dependencies] python = "^3.8" pytest = "^6.0" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api"
poetry.lock
... [[package]] name = "pytest" version = "6.2.5" description = "pytest: simple powerful testing with Python" category = "main" optional = false python-versions = ">=3.6" [package.dependencies] atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" py = ">=1.8.2" toml = "*" [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] ... [metadata.files] ... pytest = [ {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, ]
pipenv と poetry の違い
大きな違いは以下の 2 点です。
- 依存関係を解決する速度
- パッケージのビルドとリポジトリへの公開を行う機能が含まれるか
poetry は PubGrub と呼ばれるアルゴリズムにより、パッケージの依存関係の解決を行っています。これは pipenv で採用されるアルゴリズムよりも効率面で優れており、poetry が早い と言われる要因です。
また、poetry はパッケージのビルドと公開を行う機能を内包しています。独自のパッケージを PyPI にアップロードしてパブリックに公開したり、プライベートリポジトリに登録することができます。
*1:https://github.com/pyenv/pyenv
*2:https://github.com/pypa/virtualenv
*3:https://github.com/pypa/pipenv
*4:https://github.com/python-poetry/poetry
*5:https://python-poetry.org/docs/basic-usage/#installing-with-poetrylock