#
4 カスタムのインストール

たまに、 3 節で述べたような別の場所へのインストール スキームが、自分のやりたいインストール方法と違うことがあります。 もしかすると、同じベースディレクトリ下にあるディレクトリのうち、 一つか二つだけをいじりたかったり、インストールスキームを完全に 再定義したいと思うかもしれません。どちらの場合にせよ、こうした操作では カスタムのインストールスキーム を作成することになります。

別の場所へのインストールスキームに関するこれまでの説明で、 ``オーバライドするためのオプション'' というコラムにお気づきかも しれません。このオプションは、カスタムのインストールスキームを 定義するための手段です。各オーバライドオプションには、 相対パスを指定しても、絶対パスを指定しても、インストールベース ディレクトリのいずれかを明示的に指定してもかまいません。 (インストールベースディレクトリは二種類あり、それら二つは通常は 同じディレクトリです -- Unix の ``prefix スキーム'' を使っていて、 --prefix と --exec-prefix オプションを 使っているときだけ異なります。)

例えば、 Unix環境でモジュール配布物をホームディレクトリにインストール したい -- とはいえ、スクリプトは ~/bin ではなく ~/scripts に置きたい -- とします。 ご想像の通り、スクリプトを置くディレクトリは、 --install-scripts オプションで上書きできます; この場合は相対パスで指定もでき、インストールベースディレクトリ (この場合にはホームディレクトリ) からの相対パスとして解釈されます:

    python setup.py install --home=~ --install-scripts=scripts

Unix 環境での例をもう一つ紹介します: インストール済みの Python が、 /usr/local/python を prefix にしてビルドされ、インストール されていて、標準のインストールスクリプトは /usr/local/python/bin に入るようになっているとします。 /usr/local/bin に入るように したければ、絶対パスを --install-scripts オプションに 与えて上書きすることになるでしょう:

    python setup.py install --install-scripts=/usr/local/bin

(この操作を行うと、 ``prefix スキーム'' を使ったインストールに なり、 prefix は Python インタプリタがインストールされている場所 -- この場合には /usr/local/python になります。)

Windows 用の Python を管理しているのなら、サードパーティ製モジュール を prefix そのものの下ではなく、 prefix の下 にあるサブディレクトリに置きたいと考えるかもしれません。 この作業は、インストールディレクトリのカスタマイズとほぼ同じくらい 簡単です -- 覚えておかねばならないのは、モジュールには二つのタイプ、 pure モジュールと非 pure モジュール (非 pure モジュール配布物内の モジュール) があるということです。例えば以下のようにします:

    python setup.py install --install-purelib=Site --install-platlib=Site

指定したインストール先ディレクトリは、prefix からの相対です。 もちろん、prefix を .pth ファイルに入れるなどして、 これらのディレクトリが Python のモジュール検索パス内に入るように しなければなりません。 Python のモジュール検索パスを修正する方法は、 4.1 節を参照してください。

インストールスキーム全体を定義したいのなら、全てのインストール ディレクトリオプションを指定しなければなりません。この作業には、 相対パスを使った指定を勧めます; 例えば、全ての Python モジュール 関連ファイルをホームディレクトリ下の python ディレクトリの 下に置き、そのホームディレクトリをマウントしている各プラットフォーム ごとに別のディレクトリを置きたければ、以下のようにインストールスキーム を定義します:

    python setup.py install --home=~ \
                            --install-purelib=python/lib \
                            --install-platlib=python/lib.$PLAT \
                            --install-scripts=python/scripts
                            --install-data=python/data

また、以下のようにも指定できます:

    python setup.py install --home=~/python \
                            --install-purelib=lib \
                            --install-platlib='lib.$PLAT' \
                            --install-scripts=scripts
                            --install-data=data

`$PLAT` は、(必ずしも) 環境変数ではありません -- この表記は、 Distutils がコマンドラインオプションの解釈と同じやり方 で展開します。設定ファイルを解釈する際と同じです。

言うまでもないことですが、毎回新たなモジュール配布物をインストールする 度にインストールスキーム全体の指定を行っていては面倒です。そこで、 オプションは Distutils 設定ファイル (5 参照) にも 指定できます:

    [install]
    install-base=$HOME
    install-purelib=python/lib
    install-platlib=python/lib.$PLAT
    install-scripts=python/scripts
    install-data=python/data

あるいは、以下のようにも指定できます:

    [install]
    install-base=$HOME/python
    install-purelib=lib
    install-platlib=lib.$PLAT
    install-scripts=scripts
    install-data=data

これら二つは、 setup スクリプトを異なるインストールベースディレクトリ から実行した場合には同じには ならない ので注意してください。 例えば、

    python setup.py --install-base=/tmp

とすると、最初の書き方では pure モジュールが/tmp/python/lib に入り、二番目の書き方では /tmp/lib に入ります。(二番目の ケースでは、インストールベースを /tmp/python に指定しようと 考えるでしょう。)

読者は、設定ファイル例で、入力値に `$HOME` や `$PLAT` を 使っていることに気づいているかもしれませんね。これらは Distutils の 設定変数で、環境変数を彷彿とさせます。実際、この表記が使える プラットフォーム上では、設定ファイル中に環境変数を入れられますが、 Distutils は他にも、例えば `$PLAT` のようにおそらくユーザの 環境中にないような変数をいくつか持っています。(そしてもちろん、 Mac OS 9 のような環境変数のないシステムでは、設定ファイル中で 使える変数は Distutils が提供しているものだけです。)

##
1 Python サーチパスの変更

Python インタプリタが `import` 文を実行するとき、 インタプリタは Python コードや拡張モジュールをモジュール検索パス 中から探します。検索パスのデフォルト値は、インタプリタをビルドする 際に Python のバイナリ内に設定されます。検索パスは、 `sys` を import して、 `sys.path` を出力すれば わかります。

    $ python
    Python 2.2 (#11, Oct  3 2002, 13:31:27)
    [GCC 2.96 20000731 (Red Hat Linux 7.3 2.96-112)] on linux2
    Type ``help'', ``copyright'', ``credits'' or ``license'' for more information.
    >>> import sys
    >>> sys.path
    ['', '/usr/local/lib/python2.3', '/usr/local/lib/python2.3/plat-linux2',
     '/usr/local/lib/python2.3/lib-tk', '/usr/local/lib/python2.3/lib-dynload',
     '/usr/local/lib/python2.3/site-packages']
    >>>

`sys.path` 内の空文字列は、現在の作業ディレクトリを表します。

ローカルでインストールされるパッケージは、.../site-packages/ ディレクトリに入るのが決まりですが、ユーザはどこか任意のディレクトリに Python モジュールをインストールしたいと思うかもしれません。 例えば、自分のサイトでは、 web サーバに関連する全てのソフトウェア を /www に置くという決まりがあるかもしれません。そこで、 アドオンの Python モジュールが /www/python 置かれることに なると、モジュールを import するためにはディレクトリを `sys.path` に追加せねばなりません。ディレクトリを検索パスに追加するには、いくつか の異なる方法が存在します。

最も手軽な方法は、パス設定ファイルをすでに Python の検索パスに 含まれるディレクトリ、通常は .../site-packages/ ディレクトリ に置くというものです。パス設定ファイルは拡張子が .pth で、 ファイルには `sys.path` に追加するパスを一行に一つづつ 記述しなければなりません。 (新たなパスは今の `sys.path` の後ろに追加されるので、追加された ディレクトリ内にあるモジュールが標準のモジュールセットを上書き することはありません。つまり、このメカニズムを使って、標準モジュール に対する修正版のインストールはできないということです。)

パスは絶対パスでも相対パスでもよく、相対パスの場合には .pth ファイルのあるパスからの相対になります。検索パスにディレクトリが追加 されると、今度はそのディレクトリに対して .pth ファイルを 検索します。詳しくは site モジュールのドキュメント を読んでください。

やや便利さには欠けますが、Python の標準ライブラリ中にある site.py ファイルを編集することでも、`sys.path` を変更 できます。site.py は、 -S スイッチを与えて 抑制しないかぎり、Python インタプリタが実行される際に自動的に import されます。ただし、設定するには、単にsite.py を編集して、例えば 以下のような二行を加えます:

    import sys
    sys.path.append('/www/python/')

しかしながら、(例えば 2.2 から 2.2.2 にアップグレードするときのように) 同じメジャーバージョンの Python を再インストールすると、 site.py は手持ちのバージョンで上書きされてしまいます。 ファイルが変更されていることを覚えておき、インストールを行う前に コピーを忘れずとっておかねばなりません。

また、`sys.path` を修正できる二つの環境変数があります。 PYTHONHOME を使うと、インストールされている Python の プレフィクスを別の値に設定できます。 例えば、 PYTHONHOME を "`/www/python`" に設定すると、 検索パスは `['', '/www/python/lib/python2.5/', '/www/python/lib/python2.5/plat-linux2', ...]` といった具合になります。

PYTHONPATH を使うと、`sys.path` の先頭に一連の パスを追加できます。例えば、PYTHONPATH を "`/www/python:/opt/py`" に設定すると、検索パスは `['/www/python', '/opt/py']` から始まります。 (`sys.path` にディレクトリを追加するには、そのディレクトリが 実在しなければなりません; `site` は実在しないディレクトリを 除去します。)

最後に、 `sys.path` はただの普通の Python のリストなので、 どんな Python アプリケーションもエントリを追加したり除去したりと いった修正を行えます。