# 46 新しいDistutilsコマンドの作成

このセクションではDistutilsの新しいコマンドを作成する手順の概要をしめします。

新しいコマンドは `distutils.command` パッケージ中のモジュールに 作られます。command_template というディレクトリにサンプルのテン プレートがあります。このファイルを実装しようとしているコマンドと同名の 新しいモジュールにコピーしてください。 このモジュールはモジュール(とコマンド)と同じ名前のクラスを実装する必要があります。 そのため、`peel_banana`コマンド(ユーザは "`setup.py peel_banana`"と実行できます)を実装する際には、 command_templateを distutils/command/peel_banana.pyにコ ピーし、`distutils.cmd.Command`のサブクラス `peel_banana` クラスを実装するように編集してください。

`Command`のサブクラスは以下のメソッドを実装する必要があります。

`initialize_options`( | )

  このコマンドがサポートする全てのオプションのデフォルト値を設定します。 これらのデフォルトは他のコマンドやセットアップスクリプト、設定ファイル 、コマンドラインによって上書きされるかもしれません。 そのためオプション間の依存関係を記述するには適切な場所ではありません。 一般的に`initialize_options()`は単に"`self.foo = None`" のよ うな定義だけを行います。

`finalize_options`( | )

  このコマンドがサポートする全てのオプションの最終的な値を設定します。 これは可能な限り遅く呼び出されます。つまりコマンドラインや他のコマンド によるオプションの代入のあとに呼び出されます。 そのため、オプション間の依存関係を記述するのに適した場所です。 もし foo が bar に依存しており、かつ まだfooが `initialize_options()`で定義された値のままなら、 foo をbarから代入しても安全です。

`run`( | )

  コマンドの本体です。実行するべきアクションを実装しています。 `initialize_options()` で初期化され、他のコマンド され、セットアップスクリプト、コマンドライン、設定ファイルでカスタマイ ズされ、`finalize_options()`で設定されたオプションがアクションを制御します。 端末への出力とファイルシステムとのやりとりは全て`run()`が行います。

sub_commandsは コマンドの``ファミリー''を定式化したものです。 たとえば `install` は サブコマンド `install_lib`、`install_headers`などの親です。 コマンドファミリーの親は sub_commandsをクラス属性として持ちます。 2要素のタプル"`(command_name, predicate)`"のリストで、 command_nameには文字列、predicateには親コマンドのメソッドで、 現在の状況がコマンド実行にふさわしいかどうか判断するものを指定します。 (例えば `install_headers` はインストールするべき Cヘッダファイル がある時だけ有効です。) もし predicate が None なら、そのコマン ドは常に有効になります。

sub_commands は 通常クラスの最後で定義されます。 これはpredicate は boundされていないメソッドになるので、全て先に定義されてい る必要があるためです。

標準的な例は`install` コマンドです。