29.13. site — サイト固有の設定フック

ソースコード: Lib/site.py


このモジュールは初期化中に自動的にインポートされます。 自動インポートはインタプリタの -S オプションで禁止できます。

Importing this module will append site-specific paths to the module search path and add a few builtins, unless -S was used. In that case, this module can be safely imported with no automatic modifications to the module search path or additions to the builtins. To explicitly trigger the usual site-specific additions, call the site.main() function.

バージョン 3.3 で変更: Importing the module used to trigger paths manipulation even when using -S.

It starts by constructing up to four directories from a head and a tail part. For the head part, it uses sys.prefix and sys.exec_prefix; empty heads are skipped. For the tail part, it uses the empty string and then lib/site-packages (on Windows) or lib/pythonX.Y/site-packages (on Unix and Macintosh). For each of the distinct head-tail combinations, it sees if it refers to an existing directory, and if so, adds it to sys.path and also inspects the newly added path for configuration files.

バージョン 3.5 で変更: “site-python” ディレクトリのサポートは削除されました。

If a file named “pyvenv.cfg” exists one directory above sys.executable, sys.prefix and sys.exec_prefix are set to that directory and it is also checked for site-packages (sys.base_prefix and sys.base_exec_prefix will always be the “real” prefixes of the Python installation). If “pyvenv.cfg” (a bootstrap configuration file) contains the key “include-system-site-packages” set to anything other than “false” (case-insensitive), the system-level prefixes will still also be searched for site-packages; otherwise they won’t.

パス設定ファイルは name.pth という形式の名前をもつファイルで、上の4つのディレクトリのひとつにあります。その内容は sys.path に追加される追加項目(一行に一つ)です。存在しない項目は sys.path へは決して追加されませんが、項目がファイルではなくディレクトリを参照しているかどうかはチェックされません。項目が sys.path へ二回以上追加されることはありません。空行と # で始まる行は読み飛ばされます。 import で始まる(そしてその後ろにスペースかタブが続く)行は実行されます。

例えば、 sys.prefixsys.exec_prefix/usr/local に設定されていると仮定します。そのときPython X.Y ライブラリは /usr/local/lib/pythonX.Y にインストールされています。ここにはサブディレクトリ /usr/local/lib/pythonX.Y/site-packages があり、その中に三つのサブディレクトリ foo, bar および spam と二つのパス設定ファイル foo.pthbar.pth をもつと仮定します。 foo.pth には以下のものが記載されていると想定してください:

# foo package configuration

foo
bar
bletch

また、 bar.pth には:

# bar package configuration

bar

が記載されているとします。そのとき、次のバージョンごとのディレクトリが sys.path へこの順番で追加されます:

/usr/local/lib/pythonX.Y/site-packages/bar
/usr/local/lib/pythonX.Y/site-packages/foo

bletch は存在しないため省略されるということに注意してください。 bar ディレクトリは foo ディレクトリの前に来ます。なぜなら、 bar.pth がアルファベット順で foo.pth の前に来るからです。また、 spam はどちらのパス設定ファイルにも記載されていないため、省略されます。

これらのパス操作の後に、 sitecustomize という名前のモジュールをインポートしようします。そのモジュールは任意のサイト固有のカスタマイゼーションを行うことができます。典型的にはこれはシステム管理者によって site-packages ディレクトリに作成されます。 ImportError 例外が発生してこのインポートに失敗した場合は、何も表示せずに無視されます。Windows での pythonw.exe (IDLE を開始するとデフォルトで使われます)のような、Python が出力ストリームが利用出来ない状態で開始された場合、 sitecustomize から試みられた出力は無視されます。 ImportError 以外のあらゆる例外は黙殺され、そしてそれはおそらく不可思議な失敗にみえるでしょう。

このあとで、 ENABLE_USER_SITE が真であれば、任意のユーザ固有のカスタマイズを行うことが出来る usercustomize と名付けられたモジュールのインポートが試みられます。このファイルはユーザの site-packages ディレクトリ(下記参照)に作られることを意図していて、その場所はオプション -s によって無効にされない限りは sys.path に含まれます。ImportError は黙って無視されます。

いくつかの非Unixシステムでは、 sys.prefixsys.exec_prefix は空で、パス操作は省略されます。しかし、 sitecustomizeusercustomize のインポートはそのときでも試みられます。

29.13.1. readline の設定

readline をサポートするシステムではこのモジュールは、Python を 対話モード-S オプションなしで開始した場合に rlcompleter モジュールをインポートして設定します。デフォルトの振る舞いでは、タブ補完を有効にし、履歴保存ファイルに ~/.python_history を使います。これを無効にするには、あなたの sitecustomize または usercustomize あるいは PYTHONSTARTUP ファイル内で sys.__interactivehook__ 属性を削除 (または上書き) してください。 (—訳注: site モジュールは __interactivehook__ に readline 設定関数を設定後に sitecustomize 等のユーザ設定を実行します。 __interactivehook__ のチェックが行われるのは site モジュール実行の後です。 —)

バージョン 3.4 で変更: rlcompleter とhistory のアクティベーションが自動で行われるようになりました。

29.13.2. モジュールの内容

site.PREFIXES

siteパッケージディレクトリのprefixのリスト。

site.ENABLE_USER_SITE

ユーザーサイトディレクトリのステータスを示すフラグ。 True の場合、ユーザーサイトディレクトリが有効で sys.path に追加されていることを意味しています。 False の場合、ユーザによるリクエスト(オプション -sPYTHONNOUSERSITE)によって、 None の場合セキュリティ上の理由(ユーザまたはグループIDと実効IDの間のミスマッチ)あるいは管理者によって、ユーザーサイトディレクトリが無効になっていることを示しています。ユーザーサイトディレクトリのステータスを示すフラグ。 True の場合、ユーザーサイトディレクトリが有効で sys.path に追加されていることを意味しています。 False の場合、ユーザによるリクエスト(オプション -sPYTHONNOUSERSITE)によって、 None の場合セキュリティ上の理由(ユーザまたはグループIDと実効IDの間のミスマッチ)あるいは管理者によって、ユーザーサイトディレクトリが無効になっていることを示しています。

site.USER_SITE

Python 実行時のユーザの site-packages へのパスです。 getusersitepackages() がまだ呼び出されていなければ None かもしれません。デフォルト値は UNIX と frameworkなしの Mac OS X ビルドでは ~/.local/lib/pythonX.Y/site-packages 、Mac framework ビルドでは ~/Library/Python/X.Y/lib/python/site-packages、Windows では %APPDATA%\Python\PythonXY\site-packages です。このディレクトリは site ディレクトリなので、 ここにいる .pth ファイルが処理されます。

site.USER_BASE

ユーザの site-packages のベースとなるディレクトリへのパスです。 getuserbase() がまだ呼び出されていなければ None かもしれません。デフォルト値は UNIX と frameworkなしの Mac OS X ビルドでは ~/.local 、Mac framework ビルドでは ~/Library/Python/X.Y 、Windows では %APPDATA%\Python です。この値は Distutils が、スクリプト、データファイル、Python モジュールなどのインストール先のディレクトリを user installation scheme で計算するのに使われます。 PYTHONUSERBASE も参照してください。

site.main()

モジュール検索パスに標準のサイト固有ディレクトリを追加します。この関数は、Python インタプリタが -S で開始されていない限り、このモジュールインポート時に自動的に呼び出されます。

バージョン 3.3 で変更: この関数は以前は無条件に呼び出されていました。

site.addsitedir(sitedir, known_paths=None)

sys.path にディレクトリを追加し、その .pth ファイル群を処理します。典型的には sitecustomizeusercustomize 内で使われます(上述)。

site.getsitepackages()

全てのグローバルな site-packages ディレクトリのリストを返します。

バージョン 3.2 で追加.

site.getuserbase()

ユーザのベースディレクトリへのパス USER_BASE を返します。未初期化であればこの関数は PYTHONUSERBASE を参考にして、設定もします。

バージョン 3.2 で追加.

site.getusersitepackages()

ユーザのベースディレクトリへのパス USER_SITE を返します。未初期化であればこの関数は PYTHONNOUSERSITEUSER_BASE を参考にして、設定もします。

バージョン 3.2 で追加.

site モジュールはユーザディレクトリをコマンドラインから得る手段も提供しています:

$ python3 -m site --user-site
/home/user/.local/lib/python3.3/site-packages

引数なしで呼び出された場合、sys.path の中身を表示し、続けて USER_BASE とそのディレクトリが存在するかどうか、 USER_SITE とそのディレクトリが存在するかどうか、最後に ENABLE_USER_SITE の値を、標準出力に出力します。

--user-base

ユーザのベースディレクトリを表示します。

--user-site

ユーザの site-packages ディレクトリを表示します。

両方のオプションが指定された場合、ユーザのベースとユーザの site が(常にこの順序で) os.pathsep 区切りで表示されます。

いずれかのオプションが与えられた場合に、このスクリプトは次のいずれかの終了コードで終了します: ユーザの site-packages が有効ならば O 、ユーザにより無効にされていれば 1 、セキュリティ的な理由あるいは管理者によって無効にされている場合 2 、そして何かエラーがあった場合は 2 より大きな値。

参考

PEP 370 – ユーザごとの site-packages ディレクトリ