6. Distutilsの例—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.9/distutils/examples
移動先:案内検索

6.6。 Distutilsの例

ノート

このドキュメントは、 https://setuptools.readthedocs.io/en/latest/setuptools.htmlのsetuptoolsドキュメントが、現在ここに含まれているすべての関連情報を個別にカバーするまでのみ保持されます。


この章では、distutilsの使用を開始するのに役立ついくつかの基本的な例を示します。 distutilsの使用に関する追加情報は、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)

長い説明が壊れている場合、checkdocutilsパーサーを使用してそれを検出できます。

$ 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.73.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'