ヴェズルフェルニルの研究ノート

座右の銘「ただ一人犀の角のように歩め」的な研究活動ノート

【Windows】pyenv + pipenvによるPython仮想環境構築

前記事で公式版PythonとpipenvによるPython仮想環境の構築方法について書いたが、その中では以前のUbunuとMacを対象した記事で紹介したpyenvは使っていなかった。

blog.ketus-ix.work

pyenvにはWindows版が存在しており、これとpipenvを組み合わせると、下の記事で紹介したような複数のバージョンのPython仮想環境を自由に作成できるようになる。

blog.ketus-ix.work

複数のバージョンの公式版Pythonを利用したり、公式版Pythonとpipenvを組みわせる方法よりも柔軟性が高いので、Windows上でのPython仮想環境の構築方法としてはこれがお薦めと言えるだろう(公式版Pythonを使う必要性が特にないなら、初めから、本記事の内容に従ってPython開発環境を構築した方が良いと思う)。

本記事で、その方法について紹介しよう。

pyenv(pyenv-win)のインストール

Windows版pyenvはChocolateyを使ってインストールすることができる(Chocolateyについてはこちらの記事を参照のこと)。

> choco install -y pyenv-win

このコマンドを使うと、pyenv-winの実行ファイル群はフォルダ%HOMEPATH%\.pyenvにインストールされる。

pyenvの環境変数設定

pyenv-winのインストール時にシステム環境変数に下の設定が追加される。

  • PYENV%USERPROFILE%\.pyenv\pyenv-win\

システム環境変数PYENV

同時に以下の2つのパスがユーザー環境変数Pathに追加される。

  • %USERPROFILE%\.pyenv\pyenv-win\bin
  • %USERPROFILE%\.pyenv\pyenv-win\shims

ここで、元から存在しているパス "C:\Users\USERNAMR\AppData\Local\Microsoft\WindowsApps" を上の2つより検索順が後になるように変更しておく。

ユーザー環境変数Pathの編集

この変更を行なう理由は、WindowsにもデフォルトのPythonが含まれており、上のパスの検索順を高くすると、そちらのpythonコマンド(C:\Users\USERNAME\AppData\Local\Microsoft\WindowsApps\python.exe)が優先実行の対象となってしまうからだ。pyenv側のpythonコマンド(%HOMEPATH%\.pyenv\pyenv-win\shims\python)が優先実行されるようするために、この変更が必要となる。

pyenvの実行確認

上記の操作が済んだら、pyenvコマンドが実行できることを確認しておく。

> pyenv --version
pyenv 3.1.1

pyenvによるPythonのインストール

入手可能バージョン情報の更新

pyenvをインストールしたら、最初に下のコマンドを実行しておく。

> pyenv update

これによって、pyenvによって入手可能なPythonのバージョン情報が更新される。

将来新しいバージョンのPythonが追加された場合も、このコマンドによって最新のバージョン情報を取得することができる。

Pythonバージョンのインストール

下のコマンドによって、pyenvによってインストール可能なPythonのバージョン情報を取得できる。

> pyenv install --list
:: [Info] ::  Mirror: https://www.python.org/ftp/python
2.4-win32
2.4.1-win32
2.4.2-win32
2.4.3c1-win32
2.4.3-win32
2.4.4-win32
2.5-win32
2.5
2.5.1-win32
2.5.1
2.5.2-win32
2.5.2
2.5.3c1-win32
2.5.3c1
2.5.3-win32
2.5.3
2.5.4-win32
2.5.4
2.6-win32
2.6
2.6.1-win32
2.6.1
2.6.2c1-win32
2.6.2c1
2.6.2-win32
2.6.2
2.6.3rc1-win32
2.6.3rc1
2.6.3-win32
2.6.3
2.6.4rc1-win32
2.6.4rc1
2.6.4rc2-win32
2.6.4rc2
2.6.4-win32
2.6.4
2.6.5rc1-win32
2.6.5rc1
2.6.5rc2-win32
2.6.5rc2
2.6.5-win32
2.6.5
2.6.6rc1-win32
2.6.6rc1
2.6.6rc2-win32
2.6.6rc2
2.6.6-win32
2.6.6
2.7-win32
2.7
2.7.1rc1-win32
2.7.1rc1
2.7.1-win32
2.7.1
2.7.2rc1-win32
2.7.2rc1
2.7.2-win32
2.7.2
2.7.3rc1-win32
2.7.3rc1
2.7.3rc2-win32
2.7.3rc2
2.7.3-win32
2.7.3
2.7.4rc1-win32
2.7.4rc1
2.7.4-win32
2.7.4
2.7.5-win32
2.7.5
2.7.6rc1-win32
2.7.6rc1
2.7.6-win32
2.7.6
2.7.7rc1-win32
2.7.7rc1
2.7.7-win32
2.7.7
2.7.8-win32
2.7.8
2.7.9rc1-win32
2.7.9rc1
2.7.9-win32
2.7.9
2.7.10rc1-win32
2.7.10rc1
2.7.10-win32
2.7.10
2.7.11rc1-win32
2.7.11rc1
2.7.11-win32
2.7.11
2.7.12rc1-win32
2.7.12rc1
2.7.12-win32
2.7.12
2.7.13rc1-win32
2.7.13rc1
2.7.13-win32
2.7.13
2.7.14rc1-win32
2.7.14rc1
2.7.14-win32
2.7.14
2.7.15rc1-win32
2.7.15rc1
2.7.15-win32
2.7.15
2.7.16rc1-win32
2.7.16rc1
2.7.16-win32
2.7.16
2.7.17rc1-win32
2.7.17rc1
2.7.17-win32
2.7.17
2.7.18rc1-win32
2.7.18rc1
2.7.18-win32
2.7.18
3.0a1-win32
3.0a1
3.0a2
3.0a3-win32
3.0a3
3.0a4-win32
3.0a4
3.0a5-win32
3.0a5
3.0b1-win32
3.0b1
3.0b2-win32
3.0b2
3.0b3-win32
3.0b3
3.0rc1-win32
3.0rc1
3.0rc2-win32
3.0rc2
3.0rc3-win32
3.0rc3
3.0-win32
3.0
3.0.1-win32
3.0.1
3.1-win32
3.1
3.1.1-win32
3.1.1
3.1.2rc1-win32
3.1.2rc1
3.1.2-win32
3.1.2
3.1.3rc1-win32
3.1.3rc1
3.1.3-win32
3.1.3
3.1.4rc1-win32
3.1.4rc1
3.1.4-win32
3.1.4
3.2-win32
3.2
3.2.1-win32
3.2.1
3.2.2-win32
3.2.2
3.2.3-win32
3.2.3
3.2.4-win32
3.2.4
3.2.5-win32
3.2.5
3.3.0-win32
3.3.0
3.3.1-win32
3.3.1
3.3.2-win32
3.3.2
3.3.3-win32
3.3.3
3.3.4rc1-win32
3.3.4rc1
3.3.4-win32
3.3.4
3.3.5rc1-win32
3.3.5rc1
3.3.5rc2-win32
3.3.5rc2
3.3.5-win32
3.3.5
3.4.0a1-win32
3.4.0a1
3.4.0a2-win32
3.4.0a2
3.4.0a3-win32
3.4.0a3
3.4.0a4-win32
3.4.0a4
3.4.0b1-win32
3.4.0b1
3.4.0b2-win32
3.4.0b2
3.4.0b3-win32
3.4.0b3
3.4.0rc1-win32
3.4.0rc1
3.4.0rc2-win32
3.4.0rc2
3.4.0rc3-win32
3.4.0rc3
3.4.0-win32
3.4.0
3.4.1rc1-win32
3.4.1rc1
3.4.1-win32
3.4.1
3.4.2rc1-win32
3.4.2rc1
3.4.2-win32
3.4.2
3.4.3rc1-win32
3.4.3rc1
3.4.3-win32
3.4.3
3.4.4rc1-win32
3.4.4rc1
3.4.4-win32
3.4.4
3.5.0a1-win32
3.5.0a1
3.5.0a2-win32
3.5.0a2
3.5.0a3-win32
3.5.0a3
3.5.0a4-win32
3.5.0a4
3.5.0a5-win32
3.5.0a5
3.5.0b1-win32
3.5.0b1
3.5.0b2-win32
3.5.0b2
3.5.0b3-win32
3.5.0b3
3.5.0b4-win32
3.5.0b4
3.5.0rc1-win32
3.5.0rc1
3.5.0rc2-win32
3.5.0rc2
3.5.0rc3-win32
3.5.0rc3
3.5.0rc4-win32
3.5.0rc4
3.5.0-win32
3.5.0
3.5.1rc1-win32
3.5.1rc1
3.5.1-win32
3.5.1
3.5.2rc1-win32
3.5.2rc1
3.5.2-win32
3.5.2
3.5.3rc1-win32
3.5.3rc1
3.5.3-win32
3.5.3
3.5.4rc1-win32
3.5.4rc1
3.5.4-win32
3.5.4
3.6.0a1-win32
3.6.0a1
3.6.0a2-win32
3.6.0a2
3.6.0a3-win32
3.6.0a3
3.6.0a4-win32
3.6.0a4
3.6.0b1-win32
3.6.0b1
3.6.0b2-win32
3.6.0b2
3.6.0b3-win32
3.6.0b3
3.6.0b4-win32
3.6.0b4
3.6.0rc1-win32
3.6.0rc1
3.6.0rc2-win32
3.6.0rc2
3.6.0-win32
3.6.0
3.6.1rc1-win32
3.6.1rc1
3.6.1-win32
3.6.1
3.6.2rc1-win32
3.6.2rc1
3.6.2rc2-win32
3.6.2rc2
3.6.2-win32
3.6.2
3.6.3rc1-win32
3.6.3rc1
3.6.3-win32
3.6.3
3.6.4rc1-win32
3.6.4rc1
3.6.4-win32
3.6.4
3.6.5rc1-win32
3.6.5rc1
3.6.5-win32
3.6.5
3.6.6rc1-win32
3.6.6rc1
3.6.6-win32
3.6.6
3.6.7rc1-win32
3.6.7rc1
3.6.7rc2-win32
3.6.7rc2
3.6.7-win32
3.6.7
3.6.8rc1-win32
3.6.8rc1
3.6.8-win32
3.6.8
3.7.0a1-win32
3.7.0a1
3.7.0a2-win32
3.7.0a2
3.7.0a3-win32
3.7.0a3
3.7.0a4-win32
3.7.0a4
3.7.0b1-win32
3.7.0b1
3.7.0b2-win32
3.7.0b2
3.7.0b3-win32
3.7.0b3
3.7.0b4-win32
3.7.0b4
3.7.0b5-win32
3.7.0b5
3.7.0rc1-win32
3.7.0rc1
3.7.0-win32
3.7.0
3.7.1rc1-win32
3.7.1rc1
3.7.1rc2-win32
3.7.1rc2
3.7.1-win32
3.7.1
3.7.2rc1-win32
3.7.2rc1
3.7.2-win32
3.7.2
3.7.3rc1-win32
3.7.3rc1
3.7.3-win32
3.7.3
3.7.4rc1-win32
3.7.4rc1
3.7.4rc2-win32
3.7.4rc2
3.7.4-win32
3.7.4
3.7.5rc1-win32
3.7.5rc1
3.7.5-win32
3.7.5
3.7.6rc1-win32
3.7.6rc1
3.7.6-win32
3.7.6
3.7.7rc1-win32
3.7.7rc1
3.7.7-win32
3.7.7
3.7.8rc1-win32
3.7.8rc1
3.7.8-win32
3.7.8
3.7.9-win32
3.7.9
3.8.0a1-win32
3.8.0a1
3.8.0a2-win32
3.8.0a2
3.8.0a3-win32
3.8.0a3
3.8.0a4-win32
3.8.0a4
3.8.0b1-win32
3.8.0b1
3.8.0b2-win32
3.8.0b2
3.8.0b3-win32
3.8.0b3
3.8.0b4-win32
3.8.0b4
3.8.0rc1-win32
3.8.0rc1
3.8.0-win32
3.8.0
3.8.1rc1-win32
3.8.1rc1
3.8.1-win32
3.8.1
3.8.2rc1-win32
3.8.2rc1
3.8.2rc2-win32
3.8.2rc2
3.8.2-win32
3.8.2
3.8.3rc1-win32
3.8.3rc1
3.8.3-win32
3.8.3
3.8.4rc1-win32
3.8.4rc1
3.8.4-win32
3.8.4
3.8.5-win32
3.8.5
3.8.6rc1-win32
3.8.6rc1
3.8.6-win32
3.8.6
3.8.7rc1-win32
3.8.7rc1
3.8.7-win32
3.8.7
3.8.8rc1-win32
3.8.8rc1
3.8.8-win32
3.8.8
3.8.9-win32
3.8.9
3.8.10-win32
3.8.10
3.9.0a1-win32
3.9.0a1
3.9.0a2-win32
3.9.0a2
3.9.0a3-win32
3.9.0a3
3.9.0a4-win32
3.9.0a4
3.9.0a5-win32
3.9.0a5
3.9.0a6-win32
3.9.0a6
3.9.0b1-win32
3.9.0b1
3.9.0b2-win32
3.9.0b2
3.9.0b3-win32
3.9.0b3
3.9.0b4-win32
3.9.0b4
3.9.0b5-win32
3.9.0b5
3.9.0rc1-win32
3.9.0rc1
3.9.0rc2-win32
3.9.0rc2
3.9.0-win32
3.9.0
3.9.1rc1-win32
3.9.1rc1
3.9.1-win32
3.9.1
3.9.2rc1-win32
3.9.2rc1
3.9.2-win32
3.9.2
3.9.3-win32
3.9.3
3.9.4-win32
3.9.4
3.9.5-win32
3.9.5
3.9.6-win32
3.9.6
3.9.7-win32
3.9.7
3.9.8-win32
3.9.8
3.9.9-win32
3.9.9
3.9.10-win32
3.9.10
3.9.11-win32
3.9.11
3.9.12-win32
3.9.12
3.9.13-win32
3.9.13
3.10.0a1-win32
3.10.0a1
3.10.0a2-win32
3.10.0a2
3.10.0a3-win32
3.10.0a3
3.10.0a4-win32
3.10.0a4
3.10.0a5-win32
3.10.0a5
3.10.0a6-win32
3.10.0a6
3.10.0a7-win32
3.10.0a7
3.10.0b1-win32
3.10.0b1
3.10.0b2-win32
3.10.0b2
3.10.0b3-win32
3.10.0b3
3.10.0b4-win32
3.10.0b4
3.10.0rc1-win32
3.10.0rc1
3.10.0rc2-win32
3.10.0rc2
3.10.0-win32
3.10.0
3.10.1-win32
3.10.1
3.10.2-win32
3.10.2
3.10.3-win32
3.10.3
3.10.4-win32
3.10.4
3.10.5-win32
3.10.5
3.10.6-win32
3.10.6
3.10.7-win32
3.10.7
3.10.8-win32
3.10.8
3.10.9-win32
3.10.9
3.10.10-win32
3.10.10
3.10.11-win32
3.10.11
3.11.0a1-win32
3.11.0a1
3.11.0a2-win32
3.11.0a2
3.11.0a3-win32
3.11.0a3
3.11.0a4-win32
3.11.0a4
3.11.0a5-win32
3.11.0a5
3.11.0a6-win32
3.11.0a6
3.11.0a7-win32
3.11.0a7
3.11.0b1-win32
3.11.0b1
3.11.0b2-win32
3.11.0b2
3.11.0b3-win32
3.11.0b3
3.11.0b4-win32
3.11.0b4
3.11.0b5-win32
3.11.0b5
3.11.0rc1-win32
3.11.0rc1
3.11.0rc2-win32
3.11.0rc2
3.11.0-win32
3.11.0
3.11.1-win32
3.11.1
3.11.2-win32
3.11.2
3.11.3-win32
3.11.3
3.11.4-win32
3.11.4
3.11.5-win32
3.11.5
3.11.6-win32
3.11.6
3.11.7-win32
3.11.7
3.12.0a1-win32
3.12.0a1
3.12.0a2-win32
3.12.0a2
3.12.0a3-win32
3.12.0a3
3.12.0a4-win32
3.12.0a4
3.12.0a5-win32
3.12.0a5
3.12.0a6-win32
3.12.0a6
3.12.0a7-win32
3.12.0a7
3.12.0b1-win32
3.12.0b1
3.12.0b2-win32
3.12.0b2
3.12.0b3-win32
3.12.0b3
3.12.0b4-win32
3.12.0b4
3.12.0rc1-win32
3.12.0rc1
3.12.0rc2-win32
3.12.0rc2
3.12.0rc3-win32
3.12.0rc3
3.12.0-win32
3.12.0
3.12.1-win32
3.12.1
3.13.0a1-win32
3.13.0a1
3.13.0a2-win32
3.13.0a2
3.13.0a3-win32
3.13.0a3

使用する予定のバージョンのPythonをあらかじめインストールしておく。

> pyenv install 3.12.1
> pyenv install 3.11.7
> pyenv install 3.10.11
> pyenv install 3.9.13
> pyenv install 3.8.10
> pyenv rehash

後から追加することもできるので、適当なバージョンを一つ選んでインストールしておいても良いだろう。

インストール済みバージョンの表示

pyenvによってインストール済みのPythonのバージョンは、下のコマンドによって確認することができる。

> pyenv versions
  3.10.11
  3.11.7
  3.12.1
  3.8.10
  3.9.13

pyenv上でのpipenvのインストール

pipenvのインストール

> pyenv global 3.12.1
> cd
> python --version
Python 3.12.1
> pip install pipenv

pipenvの環境変数設定

pipenvがインストールができたら、ユーザー環境変数に "PIPENV_VENV_IN_PROJECT" = "true" という設定を作成しておく。

ユーザー環境変数PIPENV_VENV_IN_PROJECTの新規作成

PowerShellから下のコマンドを実行すれば、その設定操作が行える。

> [System.Environment]::SetEnvironmentVariable("PIPENV_VENV_IN_PROJECT", "true", "User")

この設定をしておくと、プロジェクトディレクトリ内に.venvというディレクトリが作成され、仮想環境のPythonインタープリタおよびパッケージはその中にインストールされるようになる。

pyenv+pipenvによる仮想環境作成/削除

仮想環境の作成

> mkdir PROJECT_DIR
> cd PROJECT_DIR
> pyenv local 3.12.1
> python --version
Python 3.12.1
> pipenv --python 3.12.1

仮想環境の削除

> cd PROJECT_DIR
> pipenv --rm

pipenvによるパッケージ管理

パッケージのインストール

> pipenv install PACKAGE_NAME

開発用パッケージのインストール

> pipenv install --dev PACKAGE_NAME

パッケージのアンインストール

> pipenv uninstall PACKAGE_NAME

pipenvによるPythonプログラム実行

仮想環境によって直接プログラムを実行

> pipenv run python PROGRAM.py

仮想環境を起動して、プログラムを実行

> pipenv shell
> python PROGRAM.py
~~~~    ~~~~
~~~~    ~~~~
~~~~    ~~~~
~~~~    ~~~~
> exit

補足説明

すでに公式版Pythonをインストール済みの場合、それとpyenvによってインストールするPythonがバッティングしてしまう。

公式版Pythonをすべてアンインストールするか、pyenv側のPythonが優先されるように調整する必要がある。

公式版Pythonのアンインストール

Chocolateyを使って公式版Pythonをインストールした場合は、下のコマンドによってをアンイストールできる。

> choco uninstall -y python

本記事の内容に従って、pyenvとpipenvによって作成した仮想環境だけを使ってPythonプログラム開発を行うなら、公式版Pythonを利用する必要性はない。

公式版よりpyenv側のPythonを優先する設定

公式版Pythonのインストール時に追加された以下の2つのパスをシステム環境変数Pathから削除して、ユーザー環境変数Pathへ移動追加する。

  • C:\Python312\Scripts\
  • C:\Python312\

その場合、pyenvによって追加された2つのパスより検索順が後になるようにする。

ユーザー環境変数Pathの編集

複数のバージョンの公式版Pythonをインストールしていた場合は、同様のすべてのパスをシステム環境変数Pathから削除して、ユーザー環境変数Pathへ移動追加しておく。

前記事の内容に従って、pipenv用の下のパスをユーザー環境変数Pathへ追加していた場合は、これを削除する。

  • C:\Users\USERNAME\AppData\Roaming\Python\Python312\Scripts

pyenv側のpipコマンドを使ってpipenvをインストールでき、それによって仮想環境を作成できるので、公式版Python側のpipenvは不要となる。

【参照リンク】

qiita.com