#
3 Windows インストーラを作成する

実行可能なインストーラは、Windows 環境ではごく自然なバイナリ配布形式 です。インストーラは結構なグラフィカルユーザインタフェースを表示して、 モジュール配布物に関するいくつかの情報を setup スクリプト内のメタデータ から取り出して示し、ユーザがいくつかのオプションを選んだり、インストール を決行するか取りやめるか選んだりできるようにします。

メタデータは setup スクリプトから取り出されるので、Windows インストーラ の作成は至って簡単で、以下を実行するだけです:

    python setup.py bdist_wininst

あるいは、`bdist` コマンドを --formats オプション付きで実行します:

    python setup.py bdist --formats=wininst

(pure Python モジュールとパッケージだけの入った) pure モジュール 配布物の場合、作成されるインストーラは実行バージョンに依存しない 形式になり、 foo-1.0.win32.exe のような名前になります。 pure モジュールの Windows インストーラは Unix や Mac OS といったプラットフォームでも作成できます。

非 pure 配布物の場合、拡張モジュールは Windows プラットフォーム上 だけで作成でき、Python のバージョンに依存したインストーラになります。 インストーラのファイル名もバージョン依存性を反映して、 foo-1.0.win32-py2.0.exe のような形式になります。 従って、サポートしたい全てのバージョンの Python に対して、 別々のインストーラを作成しなければなりません。

インストーラは、ターゲットとなるシステムにインストールを実行 した後、 pure モジュールを通常 (normal) モードと最適化 (optimizing) モードでコンパイルしようと試みます。何らかの理由があってコンパイル させたくなければ、`bdist_wininst` コマンドを --no-target-compile かつ/または --no-target-optimize オプション付きで実行します。

デフォルトでは、インストーラは実行時にクールな ``Python Powered'' ロゴを表示しますが、自作のビットマップ画像も指定できます。 画像は Windows の .bmp ファイル形式でなくてはならず、 --bitmap オプションで指定します。

インストーラを起動すると、デスクトップの背景ウィンドウ上にでっかい タイトルも表示します。タイトルは配布物の名前とバージョン番号から 作成します。--title オプションを使えば、 タイトルを別のテキストに変更できます。

インストーラファイルは ``配布物ディレクトリ (distribution directory)'' -- 通常は dist/ に作成されますが、--dist-dir オプションで指定することもできます。

##
1 インストール後実行スクリプト (postinstallation script)

Python 2.3 からは、インストール実行後スクリプトを --install-script オプションで指定できるように なりました。スクリプトはディレクトリを含まないベースネーム (basename) で指定しなければならず、スクリプトファイル名は setup 関数の scripts 引数中に挙げられていなければなりません。

指定したスクリプトは、インストール時、ターゲットとなるシステム上で 全てのファイルがコピーされた後に実行されます。このとき `argv[1]` を -install に設定します。また、アンインストール時には、 ファイルを削除する前に `argv[1]` を -remove に設定して 実行します。

Windows インストーラでは、インストールスクリプトは埋め込みで実行 され、全ての出力 (`sys.stdout`、 `sys.stderr`) はバッファにリダイレクト され、スクリプトの終了後に GUI 上に表示されます。

インストールスクリプトでは、インストール/アンインストール のコンテキストで特に有用ないくつかの機能を、追加の組み込み関数として利 用することができます。

`directory_created`( | path)

`file_created`( | path)

  これらの関数は、インストール後実行スクリプトがディレクトリやファイル を作成した際に呼び出さなければなりません。この関数はアンインストーラ に作成されたpathを登録し、配布物をアンインストールする際にファイルが 消されるようにします。安全を期すために、ディレクトリは空の時にのみ 削除されます。

`get_special_folder_path`( | csidl_string)

  この関数は、「スタートメニュー」や「デスクトップ」といった、 Windows における特殊なフォルダ位置を取得する際に使えます。 この関数はフォルダのフルパスを返します。 csidl_string は 以下の文字列のいずれかでなければなりません:

      "CSIDL_APPDATA"

      "CSIDL_COMMON_STARTMENU"
      "CSIDL_STARTMENU"

      "CSIDL_COMMON_DESKTOPDIRECTORY"
      "CSIDL_DESKTOPDIRECTORY"

      "CSIDL_COMMON_STARTUP"
      "CSIDL_STARTUP"

      "CSIDL_COMMON_PROGRAMS"
      "CSIDL_PROGRAMS"

      "CSIDL_FONTS"

  該当するフォルダを取得できなかった場合、 `OSError` が送出されます。

  どの種類のフォルダを取得できるかは、特定の Windows のバージョン ごとに異なります。また、おそらく設定によっても異なるでしょう。 詳細については、 `SHGetSpecialFolderPath()` 関数に関する Microsoft の ドキュメントを参照してください。

`create_shortcut`( | target, description, filename[, arguments[, workdir[, iconpath[, iconindex]]]])

  この関数はショートカットを作成します。 target はショートカットによって起動されるプログラムへのパスです。 description はショートカットに対する説明です。 filename はユーザから見えるショートカットの名前です。 コマンドライン引数があれば、arguments に指定します。 workdir はプログラムの作業ディレクトリです。 iconpath はショートカットのためのアイコンが入ったファイルで、 iconindex はファイル iconpath 中のアイコンへのインデクス です。これについても、詳しくは`IShellLink` インタフェースに 関する Microsoft の ドキュメントを参照してください。