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 モジュールに関するドキュメント" > 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 アプリケーションもエントリを追加したり除去したりと いった修正を行えます。

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