nikkie-ftnextの日記

イベントレポートや読書メモを発信

Q: Pythonではパッケージ管理ツールpipを含まない仮想環境にパッケージをインストールできる。◯か☓か

答えは◯(マル)

この記事では、pipを含まない仮想環境にパッケージをpip installします。
「pipを含まない仮想環境」についてはこちらをどうぞ

pipコマンドがないですが、pip installします
大丈夫ですか? ついてこれてます?
書いている私も「正気か?」と思いながら書いているので、ひとまず安心してください。

なお、この知見は「へぇ」レベルで、Pythonを使っていく上では役に立たないと思います(ここで引き返してもええんやで)。

目次

実験環境の用意

冒頭で紹介した記事に沿って用意します。
Python 3.11.4で動作確認しました。

% python -m venv venv/with_pip --upgrade-deps
% source venv/with_pip/bin/activate
(with_pip) % python -m pip list
Package    Version
---------- -------
pip        23.3.2
setuptools 69.0.3
(with_pip) % deactivate
% python -m venv venv/no_pip --without-pip
% source venv/no_pip/bin/activate
(no_pip) % python -m pip list
/.../venv/no_pip/bin/python: No module named pip

仮想環境no_pipにはpipがありません(pip listができていません)

ディレクトリの構造です

.
└── venv/
    ├── with_pip/  # pipのある仮想環境
    └── no_pip/  # pipのない仮想環境

ここから、pipがないけどpip installしていきます。

環境変数PYTHONPATHを指定する

俺様の美技に酔いな(注:どう考えても美しくないハックです)

(no_pip) % PYTHONPATH=$PWD/venv/with_pip/lib/python3.11/site-packages python -m pip list
Package    Version
---------- -------
pip        23.3.2
setuptools 69.0.3

(no_pip) % PYTHONPATH=$PWD/venv/with_pip/lib/python3.11/site-packages python -m pip install kojo-fan-art
Successfully installed kojo-fan-art-0.1.1

(no_pip) % PYTHONPATH=$PWD/venv/with_pip/lib/python3.11/site-packages python -m pip list
Package      Version
------------ -------
kojo-fan-art 0.1.1
pip          23.3.2
setuptools   69.0.3

(no_pip) % kojo-day kokoro
{"kokoro": "Monday"}
(no_pip) % deactivate

仮想環境no_pipに自作パッケージ1をインストールでき、パッケージのコマンドを実行できました!

仮想環境with_pipにはインストールしていません

% source venv/with_pip/bin/activate
(with_pip) % python -m pip list
Package    Version
---------- -------
pip        23.3.2
setuptools 69.0.3
(with_pip) % kojo-day
zsh: command not found: kojo-day

macOSなのでzshです)

PYTHONPATHって、何よ?

https://docs.python.org/ja/3/using/cmdline.html#envvar-PYTHONPATH

モジュールファイルのデフォルトの検索パスを追加します。

PyCon APAC 2023「ModuleNotFoundErrorの傾向と対策」より

pipもモジュールですから、モジュールの検索パスに則ります。
no_pip仮想環境を有効にした後

  • PYTHONPATHを指定しない場合は、pipモジュールを検索しても見つけられません
  • 上記のようにPYTHONPATHで(with_pip仮想環境の)pipがインストールされているディレクトリを指定した場合は、pipが見つかります

つまり、仮想環境内にpipがなくとも、PYTHONPATH環境変数の指定によりpipを見つけられたので、インストール(pip install)できたということです

終わりに

環境変数PYTHONPATHを使って、pipを含まない仮想環境にパッケージをpip installしました。
仮想環境にpipがなくとも、pipがあるディレクトリを検索パスに追加できるので、一見矛盾したこんなこともできちゃうんですね。