7。 例
この章では、distutilsの使用を開始するのに役立ついくつかの基本的な例を示します。 distutilsの使用に関する追加情報は、Distutilsクックブックにあります。
7.1。 純粋なPythonディストリビューション(モジュール別)
いくつかのモジュールを配布するだけの場合、特にそれらが特定のパッケージに含まれていない場合は、セットアップスクリプトのpy_modules
オプションを使用して個別に指定できます。
最も単純なケースでは、心配する2つのファイルがあります。セットアップスクリプトと、配布する単一のモジュール、この例ではfoo.py
です。
<root>/
setup.py
foo.py
(このセクションのすべての図で、' 配布ルートディレクトリを参照します。)この状況を説明するための最小限のセットアップスクリプトは次のようになります。
from distutils.core import setup
setup(name='foo',
version='1.0',
py_modules=['foo'],
)
ディストリビューションの名前はname
オプションで個別に指定され、ディストリビューション内の唯一のモジュールの名前と同じである必要があるという規則はありません(ただし、これはおそらく従う)。 ただし、ファイル名の生成にはディストリビューション名が使用されるため、文字、数字、アンダースコア、およびハイフンを使用する必要があります。
py_modules
はリストなので、もちろん複数のモジュールを指定できます。 モジュールfoo
およびbar
を配布している場合、セットアップは次のようになります。
<root>/
setup.py
foo.py
bar.py
セットアップスクリプトは
from distutils.core import setup
setup(name='foobar',
version='1.0',
py_modules=['foo', 'bar'],
)
モジュールのソースファイルを別のディレクトリに置くこともできますが、それを行うのに十分なモジュールがある場合は、モジュールを個別にリストするよりも、パッケージごとに指定する方がおそらく簡単です。
7.2。 純粋なPythonディストリビューション(パッケージ別)
配布するモジュールが2つ以上ある場合、特にそれらが複数のパッケージに含まれている場合は、個々のモジュールよりもパッケージ全体を指定する方がおそらく簡単です。 これは、モジュールがパッケージに含まれていない場合でも機能します。 ルートパッケージからモジュールを処理するようにDistutilsに指示するだけで、他のパッケージと同じように機能します(__init__.py
ファイルが必要ないことを除いて)。
最後の例のセットアップスクリプトは、次のように書くこともできます。
from distutils.core import setup
setup(name='foobar',
version='1.0',
packages=[''],
)
(空の文字列はルートパッケージを表します。)
これらの2つのファイルがサブディレクトリに移動されたが、ルートパッケージに残っている場合、例:
<root>/
setup.py
src/ foo.py
bar.py
その場合でもルートパッケージを指定しますが、ルートパッケージ内のソースファイルが存在する場所をDistutilsに通知する必要があります。
from distutils.core import setup
setup(name='foobar',
version='1.0',
package_dir={'': 'src'},
packages=[''],
)
ただし、より一般的には、同じパッケージ(またはサブパッケージ)で複数のモジュールを配布する必要があります。 たとえば、foo
およびbar
モジュールがパッケージfoobar
に属している場合、ソースツリーをレイアウトする1つの方法は次のとおりです。
<root>/
setup.py
foobar/
__init__.py
foo.py
bar.py
これは実際、Distutilsが期待するデフォルトのレイアウトであり、セットアップスクリプトで説明するのに必要な作業が最も少ないレイアウトです。
from distutils.core import setup
setup(name='foobar',
version='1.0',
packages=['foobar'],
)
パッケージの名前が付けられていないディレクトリにモジュールを配置する場合は、package_dir
オプションを再度使用する必要があります。 たとえば、src
ディレクトリがfoobar
パッケージ内のモジュールを保持している場合:
<root>/
setup.py
src/
__init__.py
foo.py
bar.py
適切なセットアップスクリプトは次のようになります
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
この場合、セットアップスクリプトは次のようになります。
from distutils.core import setup
setup(name='foobar',
version='1.0',
package_dir={'foobar': ''},
packages=['foobar'],
)
(空の文字列は現在のディレクトリも表します。)
サブパッケージがある場合は、packages
に明示的にリストする必要がありますが、package_dir
のエントリはすべて自動的にサブパッケージに拡張されます。 (言い換えると、Distutilsはソースツリーをスキャンせず、__init__.py
ファイルを探してPythonパッケージに対応するディレクトリを見つけようとします。)したがって、デフォルトのレイアウトが大きくなると、サブパッケージ:
<root>/
setup.py
foobar/
__init__.py
foo.py
bar.py
subfoo/
__init__.py
blah.py
その場合、対応するセットアップスクリプトは次のようになります。
from distutils.core import setup
setup(name='foobar',
version='1.0',
packages=['foobar', 'foobar.subfoo'],
)
7.3。 単一の拡張モジュール
拡張モジュールは、ext_modules
オプションを使用して指定されます。 package_dir
は、拡張ソースファイルが見つかる場所には影響しません。 純粋なPythonモジュールのソースにのみ影響します。 最も単純なケースである、単一のCソースファイル内の単一の拡張モジュールは次のとおりです。
<root>/
setup.py
foo.c
foo
拡張機能がルートパッケージに属している場合、このためのセットアップスクリプトは次のようになります。
from distutils.core import setup
from distutils.extension import Extension
setup(name='foobar',
version='1.0',
ext_modules=[Extension('foo', ['foo.c'])],
)
拡張機能が実際にパッケージに属している場合、たとえばfoopkg
の場合、
まったく同じソースツリーレイアウトで、この拡張機能は、拡張機能の名前を変更するだけでfoopkg
パッケージに入れることができます。
from distutils.core import setup
from distutils.extension import Extension
setup(name='foobar',
version='1.0',
ext_modules=[Extension('foopkg.foo', ['foo.c'])],
)