Python環境とパッケージ作成

Date: 2021/06/17 (initial publish), 2021/08/03 (last update)

Source: jp/note-00037.md

Previous Post Top Next Post

TOC

Pythonで書かれたプログラム管理は、Debian供給のdebパッケージを使う限り、 普通にAPTで管理するだけなので簡単です。

一方、ソースからの導入などを考え出すと、Pythonのモジュール管理の変遷もあり結構ややこしいので、ここで復習します。

Python のパッケージの導入

Debian供給のdebパッケージ以外からの導入の基本ルールは、 OS環境をコンタミしないようにするのが賢明です。

具体的には、ソースからバイナリパッケージのwheelを作成しての導入の場合や、 外部レポジトリーのPython Package Indexからの導入の場合のともに、 仮想環境(7) の手法を使って導入という流れです。

Python関連のPython Packaging User Guideからリンクされた サイトの公式マニュアルにある、python3 -m pip install --upgrade pip setuptools wheel 等のコマンドを、安定版システムで漫然と通常のシェルから実行すると最新版が導入され、 その後のシェル環境からはこちらが優先され実行されるようになり、 干渉するかもしれないので要注意です。

pipをpipxとすれば良いだけですが、気をつけたいところです.

Python のパッケージの作成

また、モジュールパッケージを導入する際に、昔の基本の distutils を使おうとすると、最近はマニュアルにLegacy等と書いてあるので 不安になります。当時は、python3 setup.py install ...等として いきなりターゲットディレクトリーに書き込みモジュールパッケージを導入 していました。

現在はPython Packaging Authorityのルールに合致させ Python Package Indexにアップロード出きるようにするには、 distutilsではなく 殆ど変わらない使い勝手のsetuptoolsと 合わせてwheelを用い、setup.pyを作成すれば、 python3 setup.py bdist_wheel等としてwheel形式でのモジュールパッケージ 出力が難なくできます。

wheel形式でのモジュールパッケージはpipで 扱えます。

ちなみに、distributeは、 setuptoolsにマージされたとか、 setuptoolsが以前使っていた easy_install は非推薦ツールとなり、wheel形式でモジュールパッケージを作成し pipでモジュールパッケージを導入するようになったという、 過去の経緯を理解しないといろんな手法の立ち位置がわかりにくいです。

wheel形式とは、その実体はクロスプラットフォームで一番使われる アーカイブ形式のZIPファイルです。

さらに最近のPEP517に準拠させるには、 別のパッケージ作成インフラを使おうとしないなら、単に PEP518準拠の、 以下のpyproject.tomlを加えれば充分です。

[build-system]
requires = [
    "setuptools>=42",
    "wheel"
]
build-backend = "setuptools.build_meta"

ちなみに、Bullseye環境は以下のバージョンですので余裕です。

ii  python3-build                 0.1.0-3         all          Simple, correct PEP517 package builder (Python 3)
ii  python3-distutils             3.9.2-1         all          distutils package for Python 3.x
ii  python3-distutils-extra       2.45            all          enhancements to the Python3 build system
ii  python3-pip                   20.3.4-2        all          Python package installer
ii  python3-setuptools            52.0.0-3        all          Python3 Distutils Enhancements
ii  python3-toml                  0.10.1-1        all          library for Tom's Obvious, Minimal Language - Python 3.x
ii  python3-venv                  3.9.2-3         amd64        venv module for python3 (default python3 version)
ii  python3-wheel                 0.34.2-1        all          built-package format for Python
ii  python3-xdg                   0.27-2          all          Python 3 library to access freedesktop.org standards

このようにPEP517に準拠させることで、 buildを使ってwheelパッケージが作れるようになります。

作成したモジュールパッケージテストする際には、全てpython3 -m venv ... を使って作成した仮想化された環境の中でのみ実行することを意識すれば 大きな問題は起きないはずです。

Debianパッケージ作成時に、昔python3 setup.py install --prefix=... としている辺りが、最新のPEP517に準拠で setup.py無しのsetup.cfgだけの場合などでは python3 -m build --no-isolationとして行くのかと思います。

(実際には、setup.py無しはまだ充分サポートされていない感じです。BTS #984824)

具体的にどうなるか等の細かな点は、 Packaging Python Projects を読みながら、後日テストパッケージを作ったりimediffを 今風の twineを用いて更新アップロードして加筆します。

Python パッケージング関連モジュールの開発状況

Python Packaging Authorityのパッケージツールを スターの数順に並べると、アップストリームのパッケージツール開発状況が 感じられます。

Previous Post Top Next Post