TSUBOCK★LABO-ツボックラボ-

とあるセキュリティエンジニアの技術メモブログ

MENU

PoetryでPythonのパッケージ管理を行う

以前の記事でPythonのパッケージ管理ソフトとしてPipenvをご紹介しましたが、私自身Pipenvを使用していたのは去年の途中まででした。

www.tsubock-lab.xyz

去年からはPipenvに代わってPoetryというパッケージ管理ソフトを使用していたので、Poetryについても紹介したいと思います。

Poetryとは

Poetry はPEP518で標準化されたpyproject.tomlを使ったパッケージ管理を行います。PoetryもPipenvと同じく、pipとvenvを組み合わせたパッケージ管理ツールです。今回もubuntu18.04の環境にインストールしてみたいと思います。

検証環境はVagrantを使って作成しています。Vagrantの使い方ついては下記の記事をどうぞ

www.tsubock-lab.xyz

Poetry のインストール

Poetryは pipコマンドでインストールすることができます。

$ pip install poetry

インストールができたことを確認するため、Poetryのバージョンを確認してみましょう。

$ poetry -V
Poetry version 1.0.9

Poetryの使い方

プロジェクトの作成

Poetryのプロジェクトの作成方法です。Poetryではpoetry newコマンドとpoetry initコマンドの2種類のプロジェクト作成方法があります。それぞれについてみてみましょう。

poetry new コマンド

poetry newコマンドはPythonプロジェクトの雛形から作成してくれるコマンドです。poetry newの後に作成したいパッケージ名を入力します。今回はtest-pkgという名前で実行してみたいと思います。

$ poetry new test-pkg
Created package test_pkg in test-pkg

実行するとカレントディレクトリにtest-pkgという名前でディレクトリが作成されます。作成されたディレクトリ構造は下記の通りです。

$ tree test-pkg/
test-pkg/
├── pyproject.toml
├── README.rst
├── test_pkg
│   └── __init__.py
└── tests
    ├── __init__.py
    └── test_test_pkg.py

2 directories, 5 files

このようにディレクトリ作成から行いたいときはpoetry newを使うといいと思います。

poetry initコマンド

poetry initコマンドはプロジェクトに pyproject.toml がない場合に新規作成するためのコマンドです。 既にプロジェクトディレクトを作成している場合によく使います。

$ poetry init
This command will guide you through creating your pyproject.toml config.

上記コマンドを実行すると対話式で情報を入力できる状態になります。

Package name [test-pkg]:
Version [0.1.0]:
Description []:
Author [None, n to skip]:  n
License []:
Compatible Python versions [^3.6]:

Would you like to define your main dependencies interactively? (yes/no) [yes]
You can specify a package in the following forms:
  - A single name (requests)
  - A name and a constraint (requests ^2.23.0)
  - A git url (git+https://github.com/python-poetry/poetry.git)
  - A git url with a revision (git+https://github.com/python-poetry/poetry.git#develop)
  - A file path (../my-package/my-package.whl)
  - A directory (../my-package/)
  - A url (https://example.com/packages/my-package-0.1.0.tar.gz)

Search for package to add (or leave blank to continue):

Would you like to define your development dependencies interactively? (yes/no) [yes]
Search for package to add (or leave blank to continue):

Generated file

[tool.poetry]
name = "test-pkg"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]

[tool.poetry.dependencies]
python = "^3.6"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"


Do you confirm generation? (yes/no) [yes]

対話が完了すると、pyproject.tomlファイルが生成されます。

仮想環境の作成先をProjectと同じディレクトリに設定する

デフォルトだとvenvで作成される仮想環境はpoetry config --listで表示されるvirtualenvs.pathに設定されているディレクトリ配下に共通的に生成されます。

$ poetry config --list
cache-dir = "/home/vagrant/.cache/pypoetry"
virtualenvs.create = true
virtualenvs.in-project = false
virtualenvs.path = "{cache-dir}/virtualenvs"  # /home/vagrant/.cache/pypoetry/virtualenvs

これはデフォルトでvirtualenvs.in-projectの設定値がfalseとなっているためであり、プロジェクトディレクトリ毎に仮想環境を作成するためには、下記コマンドを実行して設定値をtrueにする必要があります。

$ poetry config virtualenvs.in-project true

上記コマンドを実行した結果、正しく反映されているかを確認しましょう。

$ poetry config --list
cache-dir = "/home/vagrant/.cache/pypoetry"
virtualenvs.create = true
virtualenvs.in-project = true
virtualenvs.path = "{cache-dir}/virtualenvs"  # /home/vagrant/.cache/pypoetry/virtualenvs

virtualenvs.in-projectの設定値がtrueとなっていれば設定が反映されています。

Pythonパッケージの追加

Pythonパッケージをプロジェクトに追加する場合はpoetry addコマンドを実行します。

$ poetry add <追加したいPythonパッケージ>

例えば、requestsパッケージをインストールしたい場合は下記のように実行します。

$ poetry add requests

バージョンを指定してPythonパッケージを追加する

Pythonパッケージのバージョンを指定してプロジェクトに追加する場合はpoetry addコマンドでパッケージ名を指定するときにバージョン情報を付与します。

例えば、requestsは執筆日現在の最新バージョンは2.23.0ですが、例えば2.20.0をインストールしたい場合、は下記の通りに指定します。

$ poetry add requests@^2.20.0

または下記の通りに指定します。

$ poetry add "requests>=2.20.0"

追加したパッケージを削除する

Pythonパッケージを削除する場合はpoetry removeコマンドを実行します。

$ poetry remove requests

開発環境用にパッケージを追加する

$ poetry add --dev flake8 autopep

プロジェクトにインストール済みのPythonパッケージを確認する。

プロジェクトにインストール済みのPythonパッケージを確認したい場合はpoetry showコマンドを実行します。このプロジェクトにどんなパッケージ入れてたか確認したいときに使用しますが、ついついpyproject.tomlファイルをcatしがち。

$ poetry show

Poetryで管理している仮想環境でプログラムを実行する。

プロジェクトの仮想環境内でプログラムを実行します。

$ poetry run <実行したいコマンド>

Pipenvと同様にpoetry shellコマンドで仮想環境内に入ることもできます。

$ poetry shell

pyproject.tomlファイルの内容をインストールする

既にあるpyproject.tomlファイルの内容をプロジェクトにインストールしたい場合はインストールしたいpyproject.tomlをファイルをプロジェクト配下に配置し、poetry installコマンドを実行します。

$ poetry install

おまけ:Poetryでrequirements.txtからパッケージをインストールする

PoetryではPipenvのようにrequirements.txtからのインストールができません。Ubuntu環境ではShellコマンドでrequirements.txt内のパッケージをひとつづつfor分で回して、poetry addしていくのがベストプラクティスかと思います。

① 事前にpoetry環境を作成する

$ poetry init

または

$ poetry new hogehoge

② for文を使ってrequirements.txtの中身をpoetry addする

$ for package in &(cat requirements.txt);do poetry add "$(package)"; done