配布パッケージ vs. インポートパッケージ#
数多くの異なったコンセプトが同じ "パッケージ" の名で呼ばれています。このページでは、"配布パッケージ" と "インポートパッケージ" という、関連してはいるが全く異なる二つの Python のパッケージングの意味を明らかにします。
配布パッケージとは何でしょうか?#
配布パッケージとは、インストール可能な一片のソフトウェアです。ほとんどの場合、これは "プロジェクト <project>" と同義です。 pip install pkg
とタイプする時、あるいは、 pyproject.toml
に dependencies = ["pkg"]
と書く時、 pkg
のところには配布パッケージの名前を書きます。Python のライブラリやツール類の集約された源として最も広く知られている PyPI で検索したり閲覧する時、あなたが目にするものは配布パッケージのリストです。あるいは、"配布パッケージ" という言葉があるプロジェクトの特定のバージョンを内包した特定のファイルのことを指す場合もあります。
Linux の世界では、 "配布パッケージ <distribution package>" が "ディストロパッケージ <distro package>" か単に "パッケージ <package>" と短縮形で呼ばれることが通常であり、 Linux ディストリビューション のシステムパッケージ管理者によって提供される何かのことであって、異なる意味で使われているということは意識しておいてください。
パッケージをインポートする、とは何でしょうか?#
インポートパッケージは Python モジュールです。したがって、 Python コードに import pkg
もしくは from pkg import func
と書く時、pkg
の部分はインポートパッケージの名称です。より精確には、インポートパッケージは、サブモジュールを内包することができる特別な Python モジュールです。通常は、インポートパッケージはファイルシステム上のディレクトリであって、モジュールを .py
の形で含み、サブパッケージをサブディレクトリの形で含むものです。
インポートパッケージを提供する配布パッケージをインストールするや否や、インポートパッケージを使用することができます。
配布パッケージとインポートパッケージの間の繋がりとは何でしょうか?#
ほとんどの場合、配布パッケージはあるひとつのインポートパッケージ (またはパッケージではないモジュール) を対応する名称で提供します。例えば、 pip install numpy
を行えば import numpy
として使うことができます。
しかしながら、これは単なる慣習です。PyPI や他のパッケージインデックスでは、配布パッケージとそれが提供するインポートパッケージの名称の間に なんらかの関係性を強制することはしません 。 (このことの帰結として、 import foo
を見たからと言って盲目的に PyPI のパッケージ foo
をインストールすることはできません; これは意図しないか、あるいは潜在的には悪意のあるパッケージをインストールしてしまうことになりかねません。)
配布パッケージは、異なる名称でインポートパッケージを提供することが可能です。この例としては、画像処理分野で人気のある Pillow です。配布パッケージの名称は Pillow
ですが、インポートパッケージとしては PIL
を提供しています。これには歴史的な理由があります: Pillow は PIL ライブラリのフォークとして始まり、PIL の既存のユーザがあまり手間をかけずに Pillow に移行できるようにインポート名称の PIL
を使い続けたのです。もっと一般的にいうと、配布パッケージとインポートパッケージの間で異なる名称を使う時のよくある理由が既存のライブラリからのフォークなのです。
(PyPI のような) あるパッケージインデックス内では、配布パッケージの名称は一意でなければなりません。他方で、インポートパッケージにはそのような要求事項はありません。同じ名称のインポートパッケージが複数の配布パッケージから提供されるということも可能です。繰り返しますが、これのよくある理由はフォークです。
一方で、あまり見かけませんが、配布パッケージは複数のインポートパッケージを提供することができます。その例は attrs 配布パッケージで、より新しい API を持つ attrs
インポートパッケージと、旧来のものだがサポートされている API を持つ attr
の両方を提供します。
配布パッケージの名称とインポートパッケージの名称は、どのように比較されるのでしょうか?#
インポートパッケージは、その名称として正当な Python 識別子 (Python の説明文書の中に exact rules が見つかるでしょう) [1] を持っているべきです。特に、単語間の区切りにアンダースコア _
を使い、また、大文字小文字を区別します。
他方で、配布パッケージはハイフン -
でもアンダースコア _
でも使うことができます。また、 名前空間パッケージ のサブパッケージをパッケージングするために使われることがあるドット .
を含むこともできます。ほとんどの目的においては、大文字小文字や -
対 _
の違いをを区別せず、例えば、 pip install Awesome_Package
と pip install awesome-package
は同じものです (詳細な規則は 名前正規化仕様 にあります) 。