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__.pylib/bar/__init__.py を探すように指示します。 (package_dir は再帰的に適用されますが、この場合 packages の下にある全てのパッケージを明示的に指定 しなければならないことを心に留めておいてください: Distutils は __init__.py を持つディレクトリを ソースツリーから再帰的にさがしたりは しません 。)

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。