home changes contents help options

210:Pythonのライブラリローダを制御する

検索パスの追加

モジュール・パッケージのインポートを行った際、これらが探されるパス「検索パス」を追加する方法を紹介します。 最も簡単な方法はおそらく .pth ファイルの追加です。

sys.path

sys.path は「検索パス」そのものです。 import 文が実行された時、 Python は sys.path リストの先頭から順番に該当するモジュール・パッケージを探し出します。この sys.path は単なるリストなのでプログラム中で動的に変更できます。また、追加するだけでなく削除することもできます。

他の方法は Python インタプリタ起動時における sys.path の初期化処理を変更するものです。

.pth ファイル

.pth という拡張子のファイルを検索パスに入れておくことで、 sys.path の末尾に検索パスを追加しておくことができます。

.pth ファイルは検索パスに含まれていれば問題なく動作はしますが、推奨される置き場所は site-package 下です。自作およびサードパーティ製モジュール・パッケージの推奨置き場と同じ場所です。

ファイル名は拡張子が .pth であれば何でもかまいませんが、読み込ませたい対象のモジュール名との関連が想像できる名前にしておくとよいでしょう。

このファイルには1行に一つずつ、追加したい検索パスを記述します。パスは絶対パスでも相対パスでもかまいません。相対パスを記述した際、基準となるパスは .pth のあるディレクトリになります。

.pth ファイルで追加された検索パスの中にある .pth ファイルも処理の対象となります。

.pth ファイルを読み込んで処理しているのは site モジュールです。このモジュールは通常 Python インタプリタの初期化中に読み込まれるため通常は問題になりません。しかしインタプリタが -S オプション付で呼び出された時には site パッケージの自動インポートが無効となります。結果、 .pth ファイルは読み込まれないこととなります。

環境変数 PYTHONPATH

環境変数 PYTHONPATH にパスを設定しておくと、 sys.path の先頭にパスを追加しておくことができます。 その結果、そのパスからもモジュール・パッケージを探すようになります。

複数のパスを記述する際にはコロンもしくはセミコロンで区切ります。

起動後に os.environ を使用して PYTHONPATH 環境変数に変更を加えても sys.path に反映されることはありません。

環境変数 PYTHONHOME

PYTHONHOME を変更するとインストール時の prefix を変更することができます。 prefix 下の lib ディレクトリなどから標準ライブラリを探すようになります。

レジストリ HKEY_LOCAL_MACHINE\Software\Python\PythonCore?\x.y\PythonPath?

Windows における標準ライブラリ探しはレジストリキー HKEY_LOCAL_MACHINE\Software\Python\PythonCore?\x.y\PythonPath? にあるパスから始まります。これを変更することもできます。 x.y は Python のバージョン番号で、たとえば Python 2.6.2 ならば 2.6 です。

import 済みモジュールの確認

import 済みモジュールの確認

sys.modules は import 済みモジュール名をキー、モジュールオブジェクトを値とした辞書です。 この辞書を確認することで import 済みのモジュールを確認できます。

>>> import sys
>>> sys.modules
{'copy_reg': <module 'copy_reg' from 'C:\python26\lib\copy_reg.pyc'>, 'sre_compi
le': <module 'sre_compile' from 'C:\python26\lib\sre_compile.pyc'>, 'encodings.c
p932': <module 'encodings.cp932' from 'C:\python26\lib\encodings\cp932.pyc'>,
# 略
}

モジュールの再 import と sys.modules の関係

モジュールの再 import はわかりにくい機能なので、ライブラリリファレンス 2.1 組み込み関数 の reload 関数の説明を読んでも内容が理解できないうちは、使用すべきではありません。

モジュール・パッケージは通常一度しか import されないという挙動は sys.modules に含まれているモジュールに対し、再度 import を行っても何も行わないようにすることで実装されています。 つまり、この辞書からモジュール名を削除することで、モジュールをふたたび import することはできなくはありません。

# spam.py
print 'spam' * 3
>>> import sys
>>> import spam # 初回インポート
spamspamspam
>>> import spam # 2度目のインポート、何も行われない
>>> sys.modules['spam'] # spam モジュールはインポート済みだから
<module 'spam' from 'spam.pyc'>
>>> del sys.modules['spam'] # インポート済みの証を削除
>>> import spam # 3度目のインポート
spamspamspam

しかし、モジュールの再 import は、 reload 関数を用いて行うほうがよいでしょう。初期化をやり直していることが reload 関数の名前から読み取れるからです。

>>> import sys
>>> import spam # 初回インポート
spamspamspam
>>> import spam # 2度目のインポート、何も行われない
>>> spam = reload(spam) # リロード
spamspamspam

参考