Windowsでのpython仮想環境:pyenv+venvの構築手順

Windowsにpythonの仮想環境を構築しようとするとき、WSLを導入すれば選択肢は広がりますが、WSLをなんらかの事情により導入できない場合は、pyenv-winによって仮想環境内のpythonのバージョンを指定し、venvにより仮想環境内のパッケージを独立に管理する方法が最も優れているように思います(少なくとも私が試した限り、他の方法ではうまくいかない)。本稿では、pyenv-winのインストール方法他仮想環境の設定、pyenv-win + venv構成の仕組み、この構成でプロジェクトを組む場合の理想的なフォルダ構成などについて説明いたします。

pyenv-winのインストール

pyenv本体ではなく、windows用のpyenvをグローバルにpipインストールします。powershellを使う場合のコードは次の通りです。

pip install pyenv-win --target $HOME\\.pyenv

次にwindowsのユーザー環境変数を新規に3つ(PYENV、PYENV_ROOT、PYENV_HOME)設定します。下記コードをpowershellで打つか、環境変数のウィンドウで設定してもよいです。この設定により、powershell上でpyenvコマンドが使えるようになります。

[System.Environment]::SetEnvironmentVariable('PYENV',$env:USERPROFILE + "\.pyenv\pyenv-win\","User")

既存のユーザー環境変数pathにも、下記の新たなpathを2つ通します。

C:\Users\USER.pyenv\pyenv-win\bin
C:\Users\USER.pyenv\pyenv-win\shims

こちらも下記コードをpowershellで打つか、環境変数のウィンドウで設定します。

[System.Environment]::SetEnvironmentVariable('path', $env:USERPROFILE + "\.pyenv\pyenv-win\bin;" + $env:USERPROFILE + "\.pyenv\pyenv-win\shims;" + [System.Environment]::GetEnvironmentVariable('path', "User"),"User")

続いてプロジェクトフォルダを作成、同フォルダの内側にコードを格納するサブフォルダを作成します。ここではプロジェクトフォルダの名称をprojetdir、コードフォルダの名称をcodeとします。projectdirの直下にコードのファイルを配置するくのではなく、一つ深くします。こうするとprojectdirフォルダ内に、後ほどvenvによって作成される仮想環境フォルダenvと、コードフォルダcodeがで並列に配置されるので、codeフォルダがすっきりします(code内にenvがない)。gitも親のprojectdirではなく、codeに設置します(envをいちいちgitignoreしなくてよい)。他方で、pyenvとvenvの2つの仮想環境はprojectdir内の全体に及ぶので、envとcodeは並列に配置されるも、codeはenvで設定されるvenv仮想環境の内側にいます。仮想環境がpyenvとvenvで二重になっている点は後述。

pyenvで使用するpythonのインストール

powershellでprojectdirにcdで入り、pyenvがインストールされていることを確認します。pyenvのバージョンが表示されれば問題ないです。

pyenv --version
>>>pyenv 2.64.11

続いてpyenvでインストール可能なpythonのバージョン一覧を取得します。ハイフンの後ろは小文字のエル(listのl、listと書いてもよい)です。

pyenv install -l

本事例ではpython 3.9.6をインストールします。

pyenv install 3.9.6

ここで言う「インストール」とはpyenvで特定のpythonのバージョンを利用可能な状態に置いたという意味で、このプロジェクト(仮想環境)にpython3.9.6がインストールされた(=バージョン3.9.6をインタープリターとして指定した)訳ではありません。pyenv versionsコマンドで利用可能な状態に置かれたpythonのバージョン一覧を確認できます。次にこのプロジェクト(仮想環境)で使用するpythonのバージョンを設定します。ここでは利用可能な状態に置いた3.9.6を早速指定します。

pyenv local 3.9.6

projectdir直下に、codeと並んで.python-versionファイルが作成されていれば、特定のpythonバージョン(ここでは3.9.6)で動くpyenvの仮想環境が出来上がっています(かつ、このpyenv環境環境は別途起動する必要なし)。venvの仮想環境フォルダenvは下記には表示していますが、次節で作成されます。

venv仮想環境の立ち上げ

projectdir内で下記コマンドを打ちます。最後のenvはvenv仮想環境内のライブラリーを管理すフォルダの名称なのでなんでもいいのですが、venv公式ドキュメントに習い、envとしています。なおここから先は、pyenvの提供する機能ではなくpython公式のvenvライブラリーによるものです。pyenvは仮想環境用のpythonのインタープリター(ようは.python-versionで指定されたPythonのバージョンでコードを翻訳する)機能を提供するのに対し、venvはライブラリーを仮想環境プロジェクト毎にそれぞれ独立して管理するツールということになります。その意味では、2つの性質の異なる補完的な仮想環境が、同一の範囲で折り重なっていると言えます(pyenv仮想環境の上に、ぴったし同じ範囲に及ぶvenv仮想環境が乗るイメージ)。

python -m venv env

projectdir内にenvフォルダが作成されていれば仮想環境の構築が出来ています。続いて、仮想環境に入ります(仮想環境をActivateします)。なお、deactivateコマンドで仮想環境から抜けることができます。

env\Scripts\activate

仮想環境に入れると、powershell上先頭に(env)と表示されます。

ライブラリーのインストール

特定のpythonのライブラリーを仮想環境内にインストールするには、まず仮想環境に入ります。(env)と表示されたことを確認し、冒頭で作成したコードを格納するサブフォルダcodeにcdで入ります。このcode内で個別のライブラリーをpip installをします。例えば、flaskの2.0.2であれば、次のようになります。

pip install Flask==2.0.2

あるいは、仮想環境では予めインストールしたいライブラリーとそのバージョン一式が特定されている場合は、requirements.txtファイルによる一括インストールが可能です。下記のようにrequirements.txt内にライブラリー一式を記述し、このファイルをcodeフォルダ内に配置します。#を使ったコメントアウトも可能です。

Flask==2.0.2
Flask-RESTful==0.3.9
Flask-JWT==0.3.2
Flask-JWT-Extended==4.3.1
Flask-SQLAlchemy==2.5.1
Flask-Cors==3.0.10
psycopg2
# uwsgi

一括インストールのコードは次の通りです(こちらも仮想環境内で実行)。

pip install -r requirements.txt

最後に仮想環境にインストールされたパッケージ一覧を確認するには、仮想環境内でpip listと打ちます。

pip list

他方でdeactivateして仮想環境から出た状態でpip listと打つと、上記の結果とは異なり、PC本体にグローバルにインストールされたライブラリー一式が表示されます。

以上で設定は完了です。コーディングはPC本体にインストールされたVsCodeなどで実施することになりますが、.pyファイルの実行時は上記の手順でpowershellから仮想環境内に入ってから実行すれば(例:python app.py)仮想環境内で実行されます。今日も最後まで読んで頂きありがとうございました。