#
1 パッケージを全て列挙する

packages オプションは、 packages リスト中で 指定されている各々のパッケージについて、パッケージ内に見つかった 全ての pure Python モジュールを処理 (ビルド、配布、インストール、等) するよう Distutils に指示します。このオプションを指定するためには、 当然のことながら各パッケージ名はファイルシステム上のディレクトリ名と 何らかの対応付けができなければなりません。デフォルトで使われる 対応関係はきわめてはっきりしたものです。すなわち、パッケージ `distutils` が配布物ルートディレクトリからの相対パス distutils で表されるディレクトリ中にあるというものです。 つまり、setup スクリプト中で `packages = ['foo']` と指定したら、 スクリプトの置かれたディレクトリからの相対パスで foo/__init__.py を探し出せると Distutils に確約した ことになります。この約束を裏切ると Distutils は警告を出しますが、 そのまま壊れたパッケージの処理を継続します。

ソースコードディレクトリの配置について違った規約を使っていても、 まったく問題はありません: 単に package_dir オプションを 指定して、 Distutils に自分の規約を教えればよいのです。 例えば、全ての Python ソースコードを lib 下に置いて、 ``ルートパッケージ'' 内のモジュール (つまり、どのパッケージ にも入っていないモジュール) を lib 内に入れ、 `foo` パッケージを lib/foo に入れる、といった 具合にしたいのなら、

    package_dir = {'': 'lib'}

を setup スクリプト内に入れます。辞書内のキーはパッケージ名で、 空のパッケージ名はルートパッケージを表します。キーに対応する値は ルートパッケージからの相対ディレクトリ名です、この場合、 `packages = ['foo']` を指定すれば、 lib/foo/__init__.py が存在すると Distutils に 確約したことになります。

もう一つの規約のあり方は `foo` パッケージを lib に 置き換え、`foo.bar` パッケージが lib/bar にある、 などとするものです。このような規約は、 setup スクリプトでは

    package_dir = {'foo': 'lib'}

のように書きます。 package_dir 辞書に `package: dir` のようなエントリがあると、 package の下にある全てのパッケージに対してこの規則が 暗黙のうちに適用され、その結果 `foo.bar` の場合が自動的に 処理されます。 この例では、 `packages = ['foo', 'foo.bar']` は、 Distutils に lib/__init__.py と lib/bar/__init__.py を探すように指示します。 (package_dir は再帰的に適用されますが、この場合 packages の下にある全てのパッケージを明示的に指定 しなければならないことを心に留めておいてください: Distutils は __init__.py を持つディレクトリを ソースツリーから再帰的にさがしたりは しません 。)