答えは◯(マル)
この記事では、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
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があるディレクトリを検索パスに追加できるので、一見矛盾したこんなこともできちゃうんですね。