PythonスクリプトをパッケージングしてPyPIに公開するまでのあれこれ

このあいだ作った、画像ファイルから EPUB ファイルをつくるスクリプトを、wheel でパッケージングして PyPI に公開した。バージョンは v0.3.0。ソースは GitHub に上げてある。

ファイル構成は変わったし、実行コマンドに click を導入して img2epub build コマンドで EPUB を生成するようにしたけど、機能的にはこのあいだのスクリプトと大して変わってないので改めては説明しない。必要なら上のリンク先を見てほしい。

代わりに、Python でパッケージを開発して PyPI に公開するまでの作業で、これまで知らなかったりあやふやだったところを調べたのでその辺についてメモしておく。以前とはやり方が変わったりしてて、知識はアップデートしなきゃならんと思った。

環境

  • Windows 10 Pro
  • PowerShell 7
  • Python 3.8.6

venv

開発用の仮想環境。以前は virtualenv というサードパーティのパッケージを使ってたけど、Python 3.3 から venv というのが標準でついてくる。プロジェクトのディレクトリで次のようにすると仮想環境が作られる。

takatoh@montana: myproject > python -m venv .venv

.venv とういのが仮想環境の名前。なんでもいいようだけど .venv とすることが多いみたい。仮想環境をアクティベートするには:

takatoh@montana: myproject > .venv/Scripts/Activate.ps1
(.venv) takatoh@montana: myproject >

アクティベートされると2行目のようにプロンプトに仮想環境名が表示される。仮想環境から抜けるにはこう:

(.venv) takatoh@montana: myproject > deactivate

作ったばかりの仮想環境には pip と setuptools しか入ってない。

(.venv) takatoh@montana: myproject > pip list
Package    Version
---------- -------
pip        20.2.1
setuptools 49.2.1
WARNING: You are using pip version 20.2.1; however, version 20.2.4 is available.
You should consider upgrading via the 'c:\users\takatoh\documents\w\myproject.venv\scripts\python.exe -m pip install --upgrade pip' command.

pip の新しいバージョンがあるのでバージョンアップしておく。

(.venv) takatoh@montana: myproject > python -m pip install --upgrade pip

setup.pyと関連ファイル

setup.py はパッケージングに使うスクリプトだけど、もろもろの設定はこのファイルには書かないのが最近の作法らしい。だから中身はこれだけ:

import setuptools


setuptools.setup()

じゃあ、設定はどこに書くのかというと setup.cfg というファイルに書く。書式も ini ファイル風。

[metadata]
name = myproject
version = attr:myproj.__version__
description = My Python project example.
author = takatoh
author_email = [email protected]
license = MIT License
classifier =
    License :: OSI Approved :: MIT License
    Programming Language :: Python
    Programming Language :: Python :: 3

[options]
zip_safe = False
packages = find:
include_package_data = True
entry_points = file:entry_points.cfg
install_requires =
    click

パッケージが実行コマンドを含むので [options] セクションに entry_points = file:entry_points.cfg を指定している。entry_points.cfg ファイルにコマンド名と実際に実行される関数を書くようになっている。その entry_points.cfg はこう:

[console_scripts]
myproj = myproj.command:main

もうひとつ、パッケージに含むファイルについて。packages = find: という記述で Python のスクリプトファイルを含めることができる。だけど場合によってはスクリプトでないファイルを含めたいこともある。img2epub ではテンプレートファイルが必要だった。そういう時には include_package_data = True としておいて、MANIFEST.in にファイルを列挙する。こんな感じ:

include myproj/data/greeting.txt

ファイルは setup.py(あるいは setup.cfg というべき?)からの相対パスで書く。

というわけで、これでパッケージングの準備は完了。設定内容自体は以前の setup.py に書くスタイルと変わらないんだけど、なんかファイルが分散してわかりにくくなったんじゃないかなぁ。

pip install -e .

pip install -e . コマンドは、開発中のパッケージを「開発モード」でインストールしてくれる。

(.venv) takatoh@montana: myproject > pip install -e .
Obtaining file:///C:/Users/takatoh/Documents/w/myproject
Collecting click
Using cached click-7.1.2-py2.py3-none-any.whl (82 kB)
Installing collected packages: click, myproject
Running setup.py develop for myproject
Successfully installed click-7.1.2 myproject

依存パッケージがあれば一緒にインストールしてくれるのはもちろんだけど、開発中のパッケージのファイルを更新すると、自動的に反映してくれる。

(.venv) takatoh@montana: myproject > pip list
Package    Version Location
---------- ------- --------------------------------------
click      7.1.2
myproject  0.0.1   c:\users\takatoh\documents\w\myproject
pip        20.2.4
setuptools 49.2.1

myproject だけパスが書いてある。これが開発中のパッケージだ。

※まだ書きかけ。

参考ページ