nikkie-ftnextの日記

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

Q: Pythonではパッケージ管理ツールpipを含まない仮想環境を作ることができる。◯か☓か

答えは◯(マル)

pipを含まない仮想環境は、作れます

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

目次

標準ライブラリのvenvの場合

https://docs.python.org/ja/3/library/venv.html#creating-virtual-environments

--without-pipオプションがあります!

Python 3.11.4で実験します1

通常の作り方2

% python -m venv venv/with_pip
% source venv/with_pip/bin/activate
(with_pip) % python -m pip list
Package    Version
---------- -------
pip        23.1.2
setuptools 65.5.0

--without-pipを指定する場合

% 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

pipがない仮想環境ができました!

サードパーティライブラリvirtualenvの場合

標準ライブラリにvenvが入った際、「サードパーティのvirtualenvに(仮想環境の概念や実装が)インスパイアされた」という一節があります。
https://docs.python.org/ja/3/whatsnew/3.3.html#pep-405-virtual-environments

Their concept and implementation are inspired by the popular virtualenv third-party package,

virtualenvも、pipを含めない仮想環境を作れます!
使うのは、--no-seedオプション、または、--without-pipオプション(どちらかを指定すればOK)
https://virtualenv.pypa.io/en/stable/cli_interface.html#no-seed

do not install seed packages

seed packagesとは

  • pip
  • setuptools
  • wheel

のこと。
ref: https://virtualenv.pypa.io/en/stable/user_guide.html#introduction (Phase 2 参照)

上記のwith_pip仮想環境にvirtualenvをインストールして実験します。

% source venv/with_pip/bin/activate
(with_pip) % python -m pip install virtualenv
(with_pip) % python -m pip freeze
distlib==0.3.8
filelock==3.13.1
platformdirs==4.1.0
virtualenv==20.25.0

通常の作り方

(with_pip) % virtualenv virtenv/virt_with_pip  # 以下のログは一部抜粋

    added seed packages: pip==23.3.1, setuptools==69.0.2, wheel==0.42.0

(with_pip) % source virtenv/virt_with_pip/bin/activate
(virt_with_pip) % python -m pip list
Package    Version
---------- -------
pip        23.3.1
setuptools 69.0.2
wheel      0.42.0

--no-seedを指定する場合

(with_pip) % virtualenv virtenv/virt_no_pip --no-seed

(with_pip) % source virtenv/virt_no_pip/bin/activate
(virt_no_pip) % python -m pip list
/.../virtenv/virt_no_pip/bin/python: No module named pip

virtualenvでも、pipがない仮想環境ができました!

終わりに

pipを含めない、Pythonの仮想環境の作り方を書きました。

  • python -m venv venv --without-pip
  • virtualenv venv --no-seed

P.S. きっかけはRye

Ryeはvirtualenvを使っています3

https://rye-up.com/guide/basics/#working-with-the-project より

To activate the virtualenv, use the standard methods:
. .venv/bin/activate

この案内を見て、「virtualenvが作るのは(venvと同様の)仮想環境だから、pipを使えばインストールされているライブラリを見られるよなー」と考えました。
素振りの地で試してみると

% source .venv/bin/activate
(unko-by-rye) % python -m pip list
/.../unko-by-rye/.venv/bin/python: No module named pip

pip が な い !!!

これをどうやっているのか実装を見たところ、pipを含まない仮想環境を作れるオプションを知ったのです。

rye syncで仮想環境を扱っています。
https://github.com/mitsuhiko/rye/blob/0.16.0/rye/src/sync.rs#L304
virtualenvコマンドを組み立てるところで、--no-seedを指定しています


  1. このPythonはpyenvでインストールしています(そのために仮想環境ではpip listではなくpython -m pip listとなるようです)
  2. Python 3.9から使える--upgrade-depsオプションが私は好きです
  3. 素振り記事で言及しています。