二つ以上のモジュールを配布する場合、とりわけ二つのパッケージに 分かれている場合、おそらく個々のモジュールよりもパッケージ全体を 指定する方が簡単です。たとえモジュールがパッケージ内に入っていなくても 状況は同じで、その場合はルートパッケージにモジュールが入っていると Distutils に教えることができ、他のパッケージと同様にうまく処理されます (ただし、__init__.py があってはなりません)。
最後の例で挙げた setup スクリプトは、
from distutils.core import setup
setup(name='foobar',
version='1.0',
packages=[''],
)
これら二つのファイルをサブディレクトリ下に移動しておいて、 インストール先はルートパッケージのままにしておきたい、例えば:
<root>/
setup.py
src/ foo.py
bar.py
from distutils.core import setup
setup(name='foobar',
version='1.0',
package_dir={'': 'src'},
packages=[''],
)
もっと典型的なケースでは、複数のモジュールを同じパッケージ (またはサブパッケージ) に入れて配布しようと思うでしょう。 例えば、foo と bar モジュールがパッケージ foobar に属する場合、ソースツリーをレイアウトする 一案として、以下が考えられます。
<root>/
setup.py
foobar/
__init__.py
foo.py
bar.py
実際、 Distutils ではこれをデフォルトのレイアウトとして想定して いて、setup スクリプトを書く際にも最小限の作業しか必要ありません:
from distutils.core import setup
setup(name='foobar',
version='1.0',
packages=['foobar'],
)
モジュールを入れるディレクトリをパッケージの名前にしたくない 場合、ここでも package_dir オプションを使う必要があります。 例えば、パッケージ foobar のモジュールが src に 入っているとします:
<root>/
setup.py
src/
__init__.py
foo.py
bar.py
適切な setup スクリプトは、
from distutils.core import setup
setup(name='foobar',
version='1.0',
package_dir={'foobar': 'src'},
packages=['foobar'],
)
また、メインパッケージ内のモジュールを配布物ルート下に 置くことがあるかもしれません:
<root>/
setup.py
__init__.py
foo.py
bar.py
この場合、 setup スクリプトは
from distutils.core import setup
setup(name='foobar',
version='1.0',
package_dir={'foobar': ''},
packages=['foobar'],
)
サブパッケージがある場合、packages で 明示的に列挙しなければなりませんが、package_dir はサブパッケージへのパスを自動的に展開します。 (別の言い方をすれば、 Distutils はソースツリーを走査せず、 どのディレクトリが Python パッケージに相当するのかを __init__.py files. を探して調べようとします。) このようにして、デフォルトのレイアウトはサブパッケージ形式に 展開されます:
<root>/
setup.py
foobar/
__init__.py
foo.py
bar.py
subfoo/
__init__.py
blah.py
対応する setup スクリプトは以下のようになります。
from distutils.core import setup
setup(name='foobar',
version='1.0',
packages=['foobar', 'foobar.subfoo'],
)
(ここでも、package_dir を空文字列にすると現在のディレクトリ を表します。)
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。