はじめに
こんにちは、株式会社インティメート・マージャー新卒 1 年目の @Elise3993 です。
普段、Python を用いた開発で何気なく使っている pip や poetry などのパッケージマネージャー。これらを使ってライブラリをインストールした際、「何を基準にしてパッケージのインストールパスを決めているんだろう?」と疑問に思ったことはありませんか?
今回はこのインストールパスが決まる仕組みについて調べた結果をお伝えします。
TL;DR
- パッケージのインストールパスは「実行環境」「配置ルール」「インストールするパッケージの性質」によって決まる
- その決定を裏側で司っているのは、Python 標準ライブラリの
sysconfigである
検証環境
この記事の内容は、以下の環境をベースに記載しています。
-
実行環境: macOS Tahoe 26.1
- Python のインストールには Python 公式サイト のインストーラーを使用
- Python のバージョン: 3.13.11
- pip のバージョン: 25.3
パッケージはどこに?
pip や poetry などのパッケージマネージャーでパッケージをインストールする際、インストールコマンドさえ打てば大体問題なく使いたいパッケージが使えるので、インストール先を意識せずになんとなく使っている人も少なくないと思います。(私もそうでした)
pip において、Python パッケージが「実際にどこにインストールされたか」を確認するコマンドは以下のとおりです。
$ pip show requests
...
Location: /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages
実際に私の環境で打ってみるとこんな感じになりました。
この Location に表示されるパスですが、pip が適当に決めているわけではありません。Python 自身が持っている「インストールパスの管理データ」を参照して決めているのです。
この「管理データ」を提供し、インストールパスのルールを決定しているのが、今回説明する sysconfig というモジュールです。
sysconfig とは?
公式ドキュメントによると、sysconfig は以下のように説明されています。
sysconfigモジュールは、インストールパスのリストや、現在のプラットフォームに関連した構成などの、Python の構成情報 (configuration information) へのアクセスを提供します。
sysconfig --- Python 構成情報へのアクセス
簡単に言うと、「Python がどこにインストールされていて、ライブラリをどこに置くべきか」というルールセットを持っているモジュールです。
Python uses an installation scheme that differs depending on the platform and on the installation options. These schemes are stored in sysconfig under unique identifiers based on the value returned by os.name. The schemes are used by package installers to determine where to copy files to.
Python のパッケージマネージャーはこの sysconfig の設定を元にパスを決めると述べられています。
パス決定のロジック
具体的に、sysconfig はどうやってパスを決めているのでしょうか?
1. 実行環境による違い
もっとも大きな分岐点は、「今、何の環境で Python を動かしているか」です。
CPython(標準的な Python)のソースコードを見てみると、実行環境ごとに明確に処理が分岐しているのが分かりやすいかと思うので、そちらをお見せしながら説明したいと思います。
仮想環境の場合、すなわち現在アクティブな Python 環境のパスと元の Python のパスが一致しない場合は、venv スキームが適用されます。
仮想環境でない場合は、Python がどの OS にインストールされているかを元に、後述するインストールオプションとスキームの対応が決まるようです。
2. 配置ルール
公式ドキュメントでは、主に以下の 3 つの配置ルール(scheme)が定義されています。
| 配置ルール名 | 説明(公式ドキュメントのものを要約) |
|---|---|
| Prefix scheme | 現在使っている Python の場所とは別のディレクトリ構成(プレフィックス)にインストールしたい場合に使う |
| User scheme | 管理者権限がない場合や、システム全体への書き込みを避けて自分専用のフォルダにインストールしたい場合に使う |
| Home scheme | 自分のフォルダ内で、Unix システムのようなフォルダ構成(lib, bin など)を作ってモジュールを管理したい場合に使う |
どれが選ばれるかによって、それぞれインストールパスが変化します。
例えば pip だと
pip install --no-user requests
を実行すると、Prefix scheme が選択され、
pip install --user requests
を実行すると、User scheme が選択されるようです。
私の環境だと、それぞれのインストール先は以下のようになりました。
(12/23追記:逆だったので修正しました)
/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages
/Users/{ユーザー名}/Library/Python/3.13/lib/python/site-packages
3. インストールするパッケージの性質
インストール先のパスは単一ではなく、インストールするパッケージが何かによっても置き場が変わります。分け方はドキュメントによると、以下のとおりです。
| キー | 説明 |
|---|---|
stdlib |
プラットフォーム非依存の標準ライブラリを格納するディレクトリ |
platstdlib |
プラットフォーム依存の標準ライブラリを格納するディレクトリ |
platlib |
プラットフォーム依存の site 向けファイルを格納するディレクトリ(C 拡張など) |
purelib |
site 向けのプラットフォーム非依存ファイル(“pure” Python)用ディレクトリ |
include |
Python C-API 向けのプラットフォーム非依存ヘッダ用ディレクトリ |
platinclude |
Python C-API 向けのプラットフォーム依存ヘッダ用ディレクトリ |
scripts |
スクリプト(実行可能ファイル)用ディレクトリ |
data |
データファイル用ディレクトリ |
「純粋に Python だけで書かれているなら purelib」、「C 言語で書かれたコンパイル済みモジュールなら platlib」といった具合に、パッケージの中身によって最適な配置場所が使い分けられています。
自分の環境で sysconfig の設定を確認してみる
理論がわかったところで、実際に手元の Mac 環境で sysconfig の中身を覗いてみましょう。Python の -m オプションを使えば、現在の設定一覧を表示できます。
$ python3 -m sysconfig
出力結果
(長いので、Paths 以降を省略しています)
Platform: "macosx-10.13-universal2"
Python version: "3.13"
Current installation scheme: "posix_prefix"
Paths:
data = "/Library/Frameworks/Python.framework/Versions/3.13"
include = "/Library/Frameworks/Python.framework/Versions/3.13/include/python3.13"
platinclude = "/Library/Frameworks/Python.framework/Versions/3.13/include/python3.13"
platlib = "/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages"
platstdlib = "/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13"
purelib = "/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages"
scripts = "/Library/Frameworks/Python.framework/Versions/3.13/bin"
stdlib = "/Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13"
...
Current installation scheme が posix_prefix になっており、それに基づいて Paths が定義されていることがわかります。
独自のディレクトリ構成
Python の入手経路・ビルド方法によっては sysconfig のソースに、ドキュメントにはない独自のインストールスキームが組み込まれている場合があります。
たとえば Debian 系 Linux では、システム管理の都合から site-packages ではなく dist-packages を使う流儀があります。これは「OS のパッケージマネージャ(apt)による管理物」と「ユーザーが pip で入れたもの」を混在させにくくするためのものです。
dist-packages instead of site-packages. Third party Python software installed from Debian packages goes into dist-packages, not site-packages. This is to reduce conflict between the system Python, and any from-source Python build you might install manually.
Python - Debian Wiki
終わりに
Advent Calendar の投稿はまだ続くので、今後もぜひお楽しみにしておいてください!