皆さまこんにちは、ウチイダです。

Python開発環境を整えるメモ、今回はパッケージ管理の仕組みをやっていきます。

前回はpythonランタイムのバージョン管理のためにpyenv を導入しました。

ウチイダの作業環境は以下です。

  • Windows 11 21H2
  • WSL2 Ubuntu20.04
  • GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)

以降の内容は、この環境にPython/Djangoの開発環境を導入していく手順メモとなります。

Python のパッケージ管理ツール

公式かつ最大手のpip

パッケージ管理ツールは公式からpip が提供されていますが、どうやら依存解決に難があるようなのです。

pip install しても、composer やnpmみたいに lock ファイルとかできないですしね…

あと、依存解決でインストールされたパッケージが、他からの依存がなくなっても削除されなかったりするようです。

ウチイダは基本的に公式のツールを使っていきたいスタンスですが、これはさすがに不安が残ります。

Pipenv, Poetry, Pyflow

というわけで、ほかの言語のパッケージ管理ツール機能を持ったサードバーティのツールを調べてみました。

Pipenv, Poetry, Pyflow の3つが有力っぽいです。Pipenv が先にリリースされて、そのあとにPoetry、 Pyflow の順番でリリースされています。

いろいろ調べたのですが、タイトルの通りPoetry を使ってみることにしました。

https://python-poetry.org/

比較は今回の趣旨ではないので、ごく簡単に理由を書いておくことにします。

  • PEPで策定されてる形式の設定ファイル(pyproject.toml)ひとつで管理できる方式
  • pyproject.toml が使えるのがPoetry とPyflow
  • Pyflow はまだ安定してないっぽい(バージョン1になってない)

選定が妥当かどうかはわかりません。技術選定の審美眼ほしい。

インストール

# 1. インストール用のスクリプトを読み込んで実行
$ curl -sSL https://install.python-poetry.org | python3 -
Retrieving Poetry metadata

# Welcome to Poetry!

This will download and install the latest version of Poetry,
a dependency and package manager for Python.

It will add the `poetry` command to Poetry's bin directory, located at:

/home/y-uchiida/.local/bin

You can uninstall at any time by executing this script with the --uninstall option,
and these changes will be reverted.

Installing Poetry (1.2.2): Done

Poetry (1.2.2) is installed now. Great!

To get started you need Poetry's bin directory (/home/y-uchiida/.local/bin) in your `PATH`
environment variable.

Add `export PATH="/home/y-uchiida/.local/bin:$PATH"` to your shell configuration file.

Alternatively, you can call Poetry explicitly with `/home/y-uchiida/.local/bin/poetry`.

You can test that everything is set up by executing:

`poetry --version`

# 2. パスが通っていなければ、以下を追加
$ echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc

# 3. poetry が実行できれば完了!
$ poetry --version

Poetry のアップデート

インストールした直後なので不要ですが、未来の自分のためにメモ。

poetry self update で更新します。

$ poetry self update
Updating Poetry version ...

Using version ^1.2.2 for poetry

Updating dependencies
Resolving dependencies... Downloading https://files.pythonhosted.org/packages/d1/20/4c2ea55d6547460a93dce9112599953be1c9Resolving dependencies... Downloading https://files.pythonhosted.org/packages/1d/38/fa96a426e0c0e68aabc68e896584b83ad1eeResolving dependencies... Downloading https://files.pythonhosted.org/packages/76/cb/6bbd2b10170ed991cf64e8c8b85e01f2fb38Resolving dependencies... (25.9s)

Writing lock file

No dependencies to install or update

Poetry のアンインストール

インストールしたばかりなのでこちらも不要ですが、未来の自分のためにメモ。

インストールのコマンドの最後に –uninstall オプションをつけるだけです。削除のためのモードも含めてるんですね。

$ curl -sSL https://install.python-poetry.org | python3 - --uninstall
Removing Poetry (1.2.2)

Poetry でプロジェクトを作る

空のプロジェクトを作るなら、poetry new <プロジェクト名>、

既存のディレクトリに作成する場合はpoetry init です。

# 新しくプロジェクト用のディレクトリを作る場合
$ poetry new porty_new_sample
Created package porty_new_sample in porty_new_sample

# 既存のディレクトリにプロジェクトを追加する場合
$ poetry init

Poerty で仮想環境を作る

Poetry はPythonのバージョン管理こそできませんが、仮想環境を作成することができます。

Python の公式ツールとなったvenv でも仮想環境は作れますが、仮想環境を起動してからスクリプトを実行しないといけないのですこし面倒です。

poetry は、そのCLIから仮想環境のランタイムで指定のスクリプトが実行できるので、開発中のコマンド実行が少し楽になるかもしれません。コマンド実行ごとのタイプ量が増えるので、一長一短かも。

仮想環境の作成先を設定

デフォルトの設定では、Poetryの仮想環境は$HOMEディレクトリ配下の専用ディレクトリに作成されます。

どの仮想環境が実行されているのかわかりづらくなるので、プロジェクトのディレクトリ内にあったほうがいいな…と思います。

というわけで、プロジェクトディレクトリ内に仮想環境が作成されるように、設定をしておきます。

$ poetry config virtualenvs.in-project true

これで、仮想環境は各プロジェクトのディレクトリ内に作成されます。

デフォルトでは.venv というディレクトリ名のようです。

仮想環境を作成・実行する

現在のターミナルで仮想環境に入るときは poetry shell、

仮想環境でコマンドを実行する場合はpoetry run <実行するコマンド>です。

# 仮想環境に入る
poetry_venv_test$ poetry shell
Spawning shell within /home/y-uchiida/poetry_venv_test/.venv
. /home/y-uchiida/poetry_venv_test/.venv/bin/activate
poetry_venv_test$ . /home/y-uchiida/poetry_venv_test/.venv/bin/activate
(poetry-venv-test-py3.11) :poetry_venv_test$

# 出る時はexit (deactivate でもOK)
(poetry-venv-test-py3.11) :poetry_venv_test$ exit

パッケージのインストール

では本題、パッケージのインストールです。

ためしにDhango 3.2 をインストールしてみます。

# パッケージを追加
$ poetry add django==3.2
Creating virtualenv poetry-add-pachage-sample in /home/y-uchiida/poetry_add_pachage_sample/.venv

Updating dependencies
Resolving dependencies... (0.1s)

Writing lock file

Package operations: 4 installs, 0 updates, 0 removals

  • Installing asgiref (3.5.2)
  • Installing pytz (2022.6)
  • Installing sqlparse (0.4.3)
  • Installing django (3.2)

# poetry.lock ができてる!
$ ll
total 28
drwxr-xr-x 5 y-uchiida y-uchiida 4096 Nov 22 16:02 ./
drwxr-xr-x 5 y-uchiida y-uchiida 4096 Nov 22 16:01 ../
drwxr-xr-x 4 y-uchiida y-uchiida 4096 Nov 22 16:02 .venv/
-rw-r--r-- 1 y-uchiida y-uchiida    0 Nov 22 15:42 README.md
-rw-r--r-- 1 y-uchiida y-uchiida 2131 Nov 22 16:02 poetry.lock
drwxr-xr-x 2 y-uchiida y-uchiida 4096 Nov 22 15:42 poetry_add_pachage_sample/
-rw-r--r-- 1 y-uchiida y-uchiida  356 Nov 22 16:02 pyproject.toml
drwxr-xr-x 2 y-uchiida y-uchiida 4096 Nov 22 15:42 tests/

poetry.lock の中身は長いので載せませんが、テキストファイルになっているので普通に読めます。

[[package]] と [package.dependencies] がセットになって、依存関係を表現しているようです。

Poetry にタスク実行機能はないのか

さて、ここまでくると、開発中に利用できるタスクランナーの機能が欲しくなってきます。

結論から言うと、Poetry はタスクランナーの機能は付いていません。

poetry run でそういうことができないのか調べてみたのですが、どうも目的が違うようです。

別のツールを使うか、Makefileなどでショートハンドを作ったりするのがよさそうです。

まとめ

今回はPoetry を利用してパッケージの依存関係ができるようにしてきました。

ウチイダはとても便利だと思ったのですが、公式の強さか、最も利用されているのはpipのようです。

依存関係が管理できないとなんだか不安なのは、Node.js やPHP での経験があるからこそでしょうか…

いずれにしても、効率的なチーム開発にはあったほうがよいでしょうし、導入している例も結構多いようなので、触っておいて損はないかなと思います。

以上です。あなたのお役に立てればうれしいです。