nikkie-ftnextの日記

イベントレポートや読書メモを発信

Pythonで自作ライブラリを作るとき、setup.pyに代えてpyproject.tomlを使ってみませんか?

はじめに

暑すぎましゅ、nikkieです。

ミリシタではエミリーちゃんがイチオシのnikkieですが(私服SHSエミリーが可愛い!)、
Pythonでは最近pyproject.tomlが熱いです。
私がこのファイルの便利さに気づいたのはごくごく最近なのですが、setup.pyを使っている方(=過去の自分)向けに、「こんな便利なファイルがあるんだよ!」とオススメしていきます。

目次

pyproject.tomlをオススメしたい背景

世はまさに大LLM時代。
ChatGPTのAPIを使ってPythonでライブラリを自作する例を頻繁に目にします。

これらはどれも課題を解決していて、さらに、それを他の人も利用できて、素晴らしいと思います!
一方、非常に細かい点ですが、私には気になることがありました。

それがsetup.pyの利用です。
自作ライブラリをGitHubからインストールできるようにするためにsetup.pyが書かれています。

Pythonのパッケージングに関するライブラリsetuptoolsのドキュメントには以下の文があります1

New projects are advised to avoid setup.py configurations (beyond the minimal stub) when custom scripting during the build is not necessary.

意訳 ビルドの間に実行されるカスタムスクリプトが必要でないとき、新しいプロジェクトには(最小のスタブを越えた)setup.pyを使った設定を避けることを強く勧めます

nikkieの認識(2023年時点)

  • 正直最初は「pyproject.toml、何が便利なの?」と思っていた(すまんかった...)
    • PoetryとかPipenvとかと一緒に使う? 学習コスト高そう...
  • 上記の一文がきっかけで「もしかしてPythonコミュニティ的にはsetup.pyからpyproject.tomlへ乗り換えが進んでいる!?」
    • 「界隈の標準から取り残されているかも」という危惧を抱く
  • 実際使ってみる2と、「これはいいものかもしれない」と思い始めた
    • dependencies, optional-dependenciesなど、いくつかの設定項目はsetup.pyよりはるかに分かりやすい
  • setup.pyを使っている方々、ぜひぜひpyproject.tomlを使ってみてくだされ〜という気持ち

setuptoolsのドキュメントにはsetup.pyとpyproject.tomlの設定例が併記されており3、非常に参考になりますよ。

からあげさんの「Pythonで自分だけのクソライブラリを作る方法」をpyproject.tomlで実装する

ばーん!

pip install git+https://github.com/ftnext/unko
>>> import unko
>>> unko.deru()
puripuri

pyproject.toml一歩目

差分はpyproject.tomlだけ、そしてその内容は以下だけです。

[project]
name = "unko"
version = "0.1"

projectテーブルにnameとversionだけ定義すれば、setup.pyと同じ役割を果たす、最小限のpyproject.tomlとなります。

この2つの設定は、setup.pyのname引数とversion引数に相当します。

# ref: https://github.com/karaage0703/unko/blob/248a7246c383df32119b1cb70976c3a641595553/setup.py
from setuptools import setup, find_packages

setup(
    name='unko',
    version='0.1',
    packages=find_packages()
)

setup.pyにあったpackages引数相当のものはどこにいったのだろうと思われるかもしれませんね。
これ、(このクソライブラリほど単純な構成なら)いらないみたいなんですよね

https://setuptools.pypa.io/en/latest/userguide/quickstart.html#package-discovery

Starting with version 61.0.0, setuptools’ automatic discovery capabilities have been improved to detect popular project layouts (such as the flat-layout and src-layout) without requiring any special configuration.

よく用いられるプロジェクトのレイアウトは(setuptoolsが)検出してくれるようなのです。
このあたりは以下などを読んで理解を深めていきたい!

すごいんだよ、pyproject.toml!

設定例

projectテーブルにどんな設定項目があるかは日本語で読める以下がオススメ!(翻訳に感謝)

私は、このドキュメントの「例」を参考にしています。
(他には知られたライブラリのリポジトリの設定値をパクるとかですね)

プロジェクトの設定だけでなく、開発に使うツールの設定も書ける!

これが本当にすごいと感じています。

開発で使うblack、pytest、mypyなどなど、これらのツールはpyproject.tomlで(も)configureできるのです!

最近の私はtaskipyを使っています([tool.taskipy.tasks])。
taskipyでコマンドをまとめられるし、各ツールの設定も記載できるし、「痒いところに手が届く1ファイルだな〜」と感じています

終わりに

setup.pyを使っていた過去の自分向けに、pyproject.tomlのススメを綴りました。

自作ライブラリを作るときに「ちょっとだけ背伸びしてpyproject.tomlを使ってみよっかな」という方がいらっしゃったらとても嬉しいです。
どんどん使おう、pyproject.toml!

pyproject.tomlのPEPもいくつかあるようで、読んでいって分かったことがあったら、別記事にアウトプットしていきます〜


  1. https://setuptools.pypa.io/en/latest/userguide/quickstart.html#setup-py
  2. pyproject.tomlデビュー
  3. setup.pyの設定を逃がせるsetup.cfgの例も併記されています(3通り見られる!)