7. Distutilsの拡張—Pythonドキュメント

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

7。 Distutilsの拡張

ノート

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


Distutilsはさまざまな方法で拡張できます。 ほとんどの拡張機能は、新しいコマンドまたは既存のコマンドの置き換えの形を取ります。 たとえば、新しいタイプのプラットフォーム固有のパッケージをサポートするために新しいコマンドを作成することができます。また、既存のコマンドを置き換えて、コマンドがパッケージでどのように動作するかの詳細を変更することもできます。

distutilsのほとんどの拡張機能は、既存のコマンドを変更するsetup.pyスクリプト内で作成されます。 多くの場合、便宜上、.pyファイルに加えて、パッケージにコピーする必要のあるいくつかのファイル拡張子を追加するだけです。

ほとんどのdistutilsコマンドの実装は、 distutils.cmd.Command クラスのサブクラスです。 新しいコマンドはCommandから直接継承する場合がありますが、置換はCommandから間接的に派生し、置換するコマンドを直接サブクラス化します。 Commandから派生するにはコマンドが必要です。

7.1。 新しいコマンドの統合

新しいコマンドの実装をdistutilsに統合する方法はいくつかあります。 最も難しいのは、distutils自体に新機能が含まれるように働きかけ、そのサポートを提供するPythonのバージョンを待つ(そして必要とする)ことです。 これは多くの理由で本当に難しいです。

最も一般的で、おそらくほとんどのニーズに最も合理的なのは、setup.pyスクリプトに新しい実装を含め、 distutils.core.setup()関数にそれらを使用させることです。

from distutils.command.build_py import build_py as _build_py
from distutils.core import setup

class build_py(_build_py):
    """Specialized Python source builder."""

    # implement whatever needs to be different...

setup(cmdclass={'build_py': build_py},
      ...)

このアプローチは、特定のパッケージを使用するために新しい実装を使用する必要がある場合に最も役立ちます。パッケージに関心のあるすべての人が新しいコマンド実装を持っている必要があるためです。

Python 2.4以降、3番目のオプションが利用可能になりました。これは、Pythonのインストールを変更せずに、既存のsetup.pyスクリプトをサポートできる新しいコマンドを追加できるようにすることを目的としています。 これにより、サードパーティの拡張機能が追加のパッケージングシステムのサポートを提供できるようになると期待されますが、コマンドは、distutilsコマンドを使用できるすべてのものに使用できます。 新しい構成オプションcommand_packages(コマンドラインオプション--command-packages)を使用して、コマンドを実装するモジュールを検索する追加のパッケージを指定できます。 すべてのdistutilsオプションと同様に、これはコマンドラインまたは構成ファイルで指定できます。 このオプションは、構成ファイルの[global]セクションで、またはコマンドラインのコマンドの前にのみ設定できます。 構成ファイルに設定されている場合は、コマンドラインからオーバーライドできます。 コマンドラインで空の文字列に設定すると、デフォルトが使用されます。 これは、パッケージに付属の構成ファイルに設定しないでください。

この新しいオプションを使用して、コマンド実装を検索するパッケージのリストに任意の数のパッケージを追加できます。 複数のパッケージ名はコンマで区切る必要があります。 指定しない場合、検索は distutils.command パッケージでのみ実行されます。 ただし、オプション--command-packages distcmds,buildcmdsを指定してsetup.pyを実行すると、パッケージ distutils.commanddistcmds、およびbuildcmdsが検索されます。その順序で。 新しいコマンドは、同じ名前を共有するクラスによって、コマンドと同じ名前のモジュールに実装されることが期待されています。 上記のコマンドラインオプションの例を考えると、コマンド bdist_openpkg は、クラスdistcmds.bdist_openpkg.bdist_openpkgまたはbuildcmds.bdist_openpkg.bdist_openpkgによって実装できます。


7.2。 新しい配布タイプの追加

ディストリビューション(dist/ディレクトリ内のファイル)を作成するコマンドは、 upload がPyPIにアップロードできるように(command, filename)ペアをself.distribution.dist_filesに追加する必要があります。 ペアのファイル名にはパス情報は含まれず、ファイル自体の名前のみが含まれます。 ドライランモードでも、作成されたものを表すためにペアを追加する必要があります。