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

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

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

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

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

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

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

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

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

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

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。