Python パッケージマネージャー比較


※ Pycon 2020 の企業ブースにて行った LT 用のスライドです


自己紹介

  • 山元 翔太
  • ビザスク アドバイザー開発チーム
  • フロントエンド中心

はじめに

  • Python は npm, bundler のような明確なデファクトスタンダードなツールがない
    • 大体のツールが pip を内部で使ってはいる
  • やりたいことや、開発スピード等を考慮して選定する

やりたいこと

  • 子依存まで含めたバージョンの固定
  • パッケージのバージョンアップ
  • 簡単なスクリプトの登録

話さないこと

  • パッケージのビルド、PyPI へ公開など
    • setup.cfg, wheel
    • ライブラリとして公開しないアプリケーションを想定

紹介するツール

  • pip-tools
  • pipenv
  • poetry

今回話さないツール

  • anaconda
    • 主に機械学習を行う環境を構築する際によく使われる
    • Web アプリの開発に利用するには向いていない
  • flit
  • Pyflow

pip-tools


バージョン管理

  • requirements.in, requirements.txt
    • dev-requirements.in 等を用意することで dev パッケージと分けることができる
    • pip-compile requirements.inrequirements.txt を生成する
    • pip-sync でインストールする

バージョンアップ

  • 個別にパッケージをアップデートする事ができる
    • pip-compile --upgrade-package django

簡単なスクリプトの登録

  • なし

pipenv


バージョン管理

  • Pipfile, Pipfile.lock
    • dev パッケージと分けて記述できる

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[packages]
requests = "*"


[dev-packages]
pytest = "*"

バージョンアップ

  • すべてのパッケージをまとめて更新する
    • 個別にパッケージを更新することはできない
  • install 時にもすべてのパッケージを更新する
    • Pipfile に記述したバージョンを超えることはない

簡単なスクリプトの登録

  • Pipfile の scripts に記述する
    • pipenv run foo で実行
[scripts]
lint = "flake8"

その他


poetry


バージョン管理

  • pyproject.toml, poetry.lock
    • dev パッケージと分けて記述できる

[tool.poetry.dependencies]
requests = { version = "^2.13", extras = [ "security" ] }

[tool.poetry.scripts]
my-script = 'my_package:main'

バージョンアップ

  • 個別にパッケージの更新ができる
    • 子依存まで個別にアップデートする必要がある

簡単なスクリプトの登録

  • *.py を用意しそれを実行する機能がある
    • 直接コマンドを記述することはできない
    • 都度ファイルを用意する必要があるので手軽さはない
    • 複雑なことをするのには便利

その他

  • メンテナが少なく開発スピードが遅め

まとめ

  • pipenv
    • 最近リリースが増えて改めて活発になってきている?
  • poetry