Python におけるパッケージ管理と言えば、 以前は virtualenv/venv で仮想環境を作成し、 pip を使って その仮想環境にパッケージをインストールするのが、おなじみの方法だった。
node.js の npm や .NET の dotnet restore
などに慣れている人々にとっては、 環境の管理やパッケージの管理が別々だったり、 ひとつのファイル+ひとつのコマンド で環境を復元できないのは、 ソースコード管理がスマートにできず、非常に面倒に感じる。
このため、 Python にも 仮想環境・パッケージ管理を統合するツールがいくつも生まれては消えていった。
そして、最近になってついに、 Python.org 公式が推奨する Python パッケージ管理ツールとして、 pipenv というものが登場したようだ。 (→ Python.org)
pipenv の仮想環境の場所
pipenv install
コマンドを使ってパッケージをインストールすると、 npm の package.json
にあたる Pipfile
というファイルがカレントディレクトリにできあがるが、 npm の node_modules
にあたるようなパッケージがインストールされた仮想環境のフォルダは、カレントディレクトリは(標準の設定だと)作成されない。
(なお、 環境変数 PIPENV_VENV_IN_PROJECT
に何らかの値を設定した場合は、 カレントディレクトリの ./.venv/
ディレクトリが仮想環境のフォルダになる。)
その仮想環境のフォルダの場所は pipenv --venv
コマンドで調べることができる。
Windows の場合は、 %USERPROFILE%/.virtualenvs/
に、環境毎のサブディレクトリが作成されているはずだ。
その仮想環境ディレクトリの名前の前半は、 Pipfile が存在するフォルダの名前になるが、 最後の9文字はなにやらランダムのような名前がつけられている。
例えば、 D:/pipenv/
で pipenv を初期化した場合、 %USERPROFILE%/.virtualenvs/pipenv-LAdtM08T/
が作成されるだろう。
はたして、この文字は何なのか?
仮想環境ディレクトリ名のルール
わからなかったら、ソースコードを見てみればいいじゃない。
該当するのは、 pipenv/project.py
の Project.virtualenv_name
プロパティあたりだ。
ソースを見ての通りの挙動ではあるが、 Pipfile の フルパスを UTF-8 にでデコード (※1) し、 SHA256 のダイジェストの頭 6Byte を Base64 でエンコード (※2) していることがわかる。
(※1: self.pipfile_location.encode()
)
(※2: base64.urlsafe_b64encode(hashlib.sha256(spam).digest()[:6]).decode()
)
"D:\pipenv\Pipfile"
に対してこの変換を行うと、 "LAdtM08T"
になる。
親ディレクトリの名前とくっつければ、 "pipenv-LAdtM08T"
というフォルダ名の完成だ。
すなわち、 異なるパスに同じ名前のディレクトリを作ったとしても、 仮想環境ディレクトリが重複することはまず起こらないので、 心配する必要はない。
逆に、 Pipfile のパスが変更となった場合は、 新たに仮想環境を作らなくてはならないので注意だ。