pipenv の仮想環境のフォルダ名のルール

Pocket

Python におけるパッケージ管理と言えば、 以前は virtualenv/venv で仮想環境を作成し、 pip を使って その仮想環境にパッケージをインストールするのが、おなじみの方法だった。

node.js の npm や .NET の [cci]dotnet restore[/cci] などに慣れている人々にとっては、 環境の管理やパッケージの管理が別々だったり、 ひとつのファイル+ひとつのコマンド で環境を復元できないのは、 ソースコード管理がスマートにできず、非常に面倒に感じる。

このため、 Python にも 仮想環境・パッケージ管理を統合するツールがいくつも生まれては消えていった。
そして、最近になってついに、 Python.org 公式が推奨する Python パッケージ管理ツールとして、 pipenv というものが登場したようだ。 (→ Python.org)

pipenv の仮想環境の場所

[cci]pipenv install[/cci] コマンドを使ってパッケージをインストールすると、 npm の [cci]package.json[/cci] にあたる [cci]Pipfile[/cci] というファイルがカレントディレクトリにできあがるが、 npm の [cci]node_modules[/cci] にあたるようなパッケージがインストールされた仮想環境のフォルダは、カレントディレクトリは(標準の設定だと)作成されない。 1

その仮想環境のフォルダの場所は [cci]pipenv –venv[/cci] コマンドで調べることができる。
Windows の場合は、 [cci]%USERPROFILE%/.virtualenvs/[/cci] に、環境毎のサブディレクトリが作成されているはずだ。

その仮想環境ディレクトリの名前の前半は、 Pipfile が存在するフォルダの名前になるが、 最後の9文字はなにやらランダムのような名前がつけられている。
例えば、 [cci]D:/pipenv/[/cci] で pipenv を初期化した場合、 [cci]%USERPROFILE%/.virtualenvs/pipenv-LAdtM08T/[/cci] が作成されるだろう。

はたして、この文字は何なのか?

仮想環境ディレクトリ名のルール

わからなかったら、ソースコードを見てみればいいじゃない。

該当するのは、 [cci]pipenv/project.py[/cci] の [cci]Project.virtualenv_name[/cci] プロパティあたりだ。

ソースを見ての通りの挙動ではあるが、 Pipfile の フルパスを UTF-8 にでデコードし 2 、 SHA256 のダイジェストの頭 6Byte を Base64 でエンコード 3 していることがわかる。

[cci]”D:\pipenv\Pipfile”[/cci] に対してこの変換を行うと、 [cci]”LAdtM08T”[/cci] になる。
親ディレクトリの名前とくっつければ、 [cci]”pipenv-LAdtM08T”[/cci] というフォルダ名の完成だ。

すなわち、 異なるパスに同じ名前のディレクトリを作ったとしても、 仮想環境ディレクトリが重複することはまず起こらないので、 心配する必要はない。
逆に、 Pipfile のパスが変更となった場合は、 新たに仮想環境を作らなくてはならないので注意だ。


  1. 環境変数 [cci]PIPENV_VENV_IN_PROJECT[/cci] に何らかの値を設定した場合は、 カレントディレクトリの [cci]./.venv/[/cci] ディレクトリが仮想環境のフォルダになる。 
  2. [cci]self.pipfile_location.encode()[/cci] 
  3. [cci]base64.urlsafe_b64encode(hashlib.sha256(spam).digest()[:6]).decode()[/cci] 

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください