このあいだ作った、画像ファイルから 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 だけパスが書いてある。これが開発中のパッケージだ。
※まだ書きかけ。