pyenv, virtualenv, pipenv, poetry の概要

記事タイトルとURLをコピーする

概要

開発者間で開発環境を合わせようとするときに気を付けるべきこととして、大きく以下の 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 にアップロードしてパブリックに公開したり、プライベートリポジトリに登録することができます。

2021年4月新卒入社。目に見えて、動かせるものが好き。