6.6。 Distutilsの例
ノート
このドキュメントは、 https://setuptools.readthedocs.io/en/latest/setuptools.htmlのsetuptools
ドキュメントが、現在ここに含まれているすべての関連情報を個別にカバーするまでのみ保持されます。
この章では、distutilsの使用を開始するのに役立ついくつかの基本的な例を示します。 distutilsの使用に関する追加情報は、Distutilsクックブックにあります。
6.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'],
)
モジュールのソースファイルを別のディレクトリに置くこともできますが、それを行うのに十分なモジュールがある場合は、モジュールを個別にリストするよりも、パッケージごとに指定する方がおそらく簡単です。
6.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'],
)
6.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'])],
)
6.4。 パッケージの確認
check
コマンドを使用すると、パッケージのメタデータがディストリビューションを構築するための最小要件を満たしているかどうかを確認できます。
実行するには、setup.py
スクリプトを使用して呼び出すだけです。 何かが足りない場合、check
は警告を表示します。
簡単なスクリプトで例を見てみましょう。
from distutils.core import setup
setup(name='foobar')
check
コマンドを実行すると、いくつかの警告が表示されます。
$ python setup.py check
running check
warning: check: missing required meta-data: version, url
warning: check: missing meta-data: either (author and author_email) or
(maintainer and maintainer_email) should be supplied
long_description
フィールドでreStructuredText構文を使用し、 docutils がインストールされている場合は、restructuredtext
を使用して、check
コマンドで構文に問題がないかどうかを確認できます。 ] オプション。
たとえば、setup.py
スクリプトが次のように変更された場合:
from distutils.core import setup
desc = """\
My description
==============
This is the description of the ``foobar`` package.
"""
setup(name='foobar', version='1', author='tarek',
author_email='[email protected]',
url='http://example.com', long_description=desc)
長い説明が壊れている場合、check
はdocutils
パーサーを使用してそれを検出できます。
$ python setup.py check --restructuredtext
running check
warning: check: Title underline too short. (line 2)
warning: check: Could not finish the parsing.
6.5。 メタデータの読み取り
distutils.core.setup()関数は、特定のプロジェクトのsetup.py
スクリプトを介してプロジェクトのメタデータフィールドを照会できるコマンドラインインターフェイスを提供します。
$ python setup.py --name
distribute
この呼び出しは、 distutils.core.setup()関数を実行して、name
メタデータを読み取ります。 ただし、ソースまたはバイナリディストリビューションがDistutilsで作成される場合、メタデータフィールドはPKG-INFO
という静的ファイルに書き込まれます。 DistutilsベースのプロジェクトがPythonにインストールされると、PKG-INFO
ファイルが、NAME-VERSION-pyX.X.egg-info
の下のディストリビューションのモジュールおよびパッケージと一緒にコピーされます。ここで、NAME
はプロジェクトの名前です。 、VERSION
メタデータで定義されているバージョン、およびpyX.X
2.7
や3.2
などのPythonのメジャーバージョンとマイナーバージョン。
distutils.dist.DistributionMetadata
クラスとそのread_pkg_file()
メソッドを使用して、この静的ファイルを読み戻すことができます。
>>> from distutils.dist import DistributionMetadata
>>> metadata = DistributionMetadata()
>>> metadata.read_pkg_file(open('distribute-0.6.8-py2.7.egg-info'))
>>> metadata.name
'distribute'
>>> metadata.version
'0.6.8'
>>> metadata.description
'Easily download, build, install, upgrade, and uninstall Python packages'
クラスは、その値をロードするためのメタデータファイルパスを使用してインスタンス化することもできることに注意してください。
>>> pkg_info_path = 'distribute-0.6.8-py2.7.egg-info'
>>> DistributionMetadata(pkg_info_path).name
'distribute'