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 が提供しているものだけです。)


4.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.2/', '/www/python/lib/python2.3/plat-linux2', ...] といった具合になります。

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

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

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