🌐

pyenvとpipenvの導入方法をまとめる(Windows版)

2023/05/28に公開

概要

  • Dockerを使用しないといけないレベルではないが、Python関連の環境を管理したい、またはすぐに共有したい場合にpyenvとpipenvが便利なので導入方法をまとめる。

前提

  • OS:Windows
  • 状態:Pythonをインストール済み, cmdでpipが使用できる

目次

  1. pyenv, pipenvとは?
  2. pyenv, pipenv導入方法(Windows版)
  3. 実際にpyenvとpipenvを使ってみる
  4. pipenvの応用
  5. pyenv,pipenvのリセット
  6. 参考文献

1. pyenvとpipenvとは?

pyenvとpyenv-winについて

  • pyenvPythonのバージョン管理ツールで、複数のPythonのバージョンを一つのシステム上で管理することができる。pyenvを使うと、システム全体ではなく特定のプロジェクトだけで特定のPythonのバージョンを使用することができる。
  • pyenv-winはWindowsで動作するpyenvのフォークのことを指している。元のpyenvはLinuxとmacOSを対象にしているが、pyenv-winはそれをWindowsでも使えるように拡張したものである。

pipenvとは?

  • pipenvPythonのパッケージ管理ツールで、パッケージの依存関係を管理し、仮想環境を作成する機能を提供する。
  • pipenvはPipfilePipfile.lockを使ってパッケージの依存関係を明示的に管理する。これにより、パッケージの依存関係を明確にし、再現性のある開発環境を構築することが可能になる。

2. pyenv, pipenvの導入方法(Windows版)

pyenvの導入

Step1. pyenv-winをインストールする
pyenvをWindowsで使用する時は、公式が提供しているpyenv-winを使用する。
https://github.com/pyenv-win/pyenv-win

cmd or terminal
py -m pip install pyenv-win

完了したら一度cmdを開き直しpyenvと入力する。そうすると以下のエラーがでるはずである。

pyenv
'pyenv' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

Step2. 環境変数を設定する
今回の設定で必要な環境変数は5つである。

番号 環境変数名 パスのexample
1 PATH C:\Users\ユーザ名\.pyenv\pyenv-win\bin
2 PATH C:\Users\ユーザ名\.pyenv\pyenv-win\shims
3 PYENV C:\Users\ユーザ名\.pyenv\pyenv-win
4 PYENV_ROOT C:\Users\ユーザ名\.pyenv\pyenv-win
5 PYENV_HOME C:\Users\ユーザ名\.pyenv\pyenv-win

これらの項目を設定していく。
まず、以下の写真の検索欄で環境変数と入力すると、システム環境変数の設定が出てくるはずである。

そして、システム環境変数を押し移動すると以下の写真になるはずである。

この中の環境変数(N)...を押すと以下の写真になるはずである。

上記の写真の中で設定しなければならないのがPathである。なにも触ってなければデフォルトで存在している環境変数である。このPathに先程書いた表の1,2を設定する。
もう一度インストール処理を実行する。
入力

cmd or terminal
py -m pip install pyenv-win

出力

cmd or terminal
Requirement already satisfied: pyenv-win in c:\users\hoge\hogelocal\...\site-packages (?.?.?)

のようなパスが出てくるはずである。
このパスのsite-packagesまで含めてすべてコピーする。この例でいくとc:\users\hoge\hogelocal\...\site-packages
このあとに、\pyenv-win\bin\pyenv-win\shimsを追加する。このように完成したパスを環境変数Pathに追加する。
Pathにカーソルを合わせ⇛編集をクリック⇛新規⇛パスを記述する
 最後に、PYENV, PYENV_ROOT, PYENV_HOMEを新しい環境変数として追加し、c:\users\hoge\hogelocal\...\site-packages+\pyenv-win\を環境変数に割り当てる。
これで環境変数の設定が完了した。cmdで以下のコマンドを入力し、以下の出力が出ることを確認する。
入力

cmd or terminal
pyenv

出力

cmd or terminal
pyenv ?.?.? # ←ここは現在のバージョンが入っている

Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   commands     List all available pyenv commands
   duplicate    Creates a duplicate python environment
   local        Set or show the local application-specific Python version
   global       Set or show the global Python version
   shell        Set or show the shell-specific Python version
   install      Install a Python version using python-build
   uninstall    Uninstall a specific Python version
   update       Update the cached version DB
   rehash       Rehash pyenv shims (run this after installing executables)
   vname        Show the current Python version
   version      Show the current Python version and its origin
   version-name Show the current Python version
   versions     List all Python versions available to pyenv
   exec         Runs an executable by first preparing PATH so that the selected Python
   which        Display the full path to an executable
   whence       List all Python versions that contain the given executable

See `pyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/pyenv-win/pyenv-win#readme

pipenvの導入

こちらは非常に簡単
以下のコマンドを実行するだけ

cmd or terminal
py -m pip install pipenv

3. 実際にpyenvとpipenvを使ってみる

準備ができたのでpyenvとpipenvを使って環境を構築していく。

1. pyenvの設定を行う。

Step1. 利用可能なPythonのバージョンを表示し(実行場所はどこでも良い)インストールする。
以下のコマンドを実行すると

cmd or terminal
pyenv install --list

このような出力がされる

cmd or terminal
3.10.3-win32
3.10.3
・
・
・
3.10.4-win32
3.10.4
・
・
・
3.11.0b3
3.11.0b4-win32
3.11.0b4

以下のコマンドで任意のPythonをインストールする。

cmd or terminal
pyenv install ?.?.?(バージョン名)

ここで正常にインストールできたのかを確認するために以下のコマンドを実行し確認する。
入力

cmd or terminal
pyenv versions

出力例

cmd or terminal
 3.10.5 
 3.11.0b4

Step2. pyenvでインストールしたPythonをシステムを作成しているディレクトリに固定する。
 以下のコマンドでpyenvでインストールしたPythonの中で任意のバージョンを作業ディレクトリ内に適用させることができる。

cmd or terminal
pyenv local 3.10.5

実行後には.python-versionというファイルが作成され実行ディレクトリで使用するPythonのバージョンを記録している。

2. pipenvの設定を行う

pipenvを導入する際に考えられる状況は2つある。1つ目は、新規システム開発前に環境を構築するというパターン、2つ目は、既存のシステムに環境を構築するというパターンである。

1. 新規で環境を構築するパターン**

一番最初にも説明した通り、pyenvとpipenvは独立した機能だと考えた方が良い。つまり、pyenvで指定したpythonのバージョンを自動で取得してpipfileに書き込むといった機能はなく(少なくとも僕は見つけることができなかった)、pipenvを使用する際にpyenvで指定したpythonのバージョンを指定する必要がある。
Step1. pipenvを利用して指定のPythonバージョンで仮想環境を作成する
以下のコマンドを実行

cmd or terminal
pipenv install --python 3.10.5

例えば以下のディレクトリ構成においてtestディレクトリで上記のコマンドを実行するとPipfileとPipfile.lockが生成される。

ディレクトリ構成
test
  |main.py
  |.python-version # pyenvで指定したバージョンの記録
  |Pipfile # 生成されたファイル
  |Pipfile.lock # 生成されたファイル
Pipfile
# Pipfileの中身
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]

[dev-packages]

[requires]
python_version = "3.11"
python_full_version = "3.11.0"

Step2. pipenvを利用して仮想環境にライブラリを追加する
 仮想環境にライブラリを追加する場合以下のコマンドを実行する。

cmd or terminal
pipenv install ライブラリ名==バージョン

あらかじめ使用するライブラリが決まっているのであれば、requirements.txtと命名したテキストファイルにライブラリ名とライブラリのバージョンを記述して、以下のコマンドを実行する。

requirements.txt
openpyxl==バージョン
pandas==バージョン
cmd or terminal
pipenv install -r requirements.txt
Pipfile
# Pipfileが更新されて[paclages]の中身にrequirements.txtの中身が反映されていることが分かる
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
openpyxl=="==バージョン"
pandas=="==バージョン"

[dev-packages]

[requires]
python_version = "3.11"
python_full_version = "3.11.0"

2. 既存システムに環境構築する場合

既存システムがある程度進んでいる場合、requirements.txtを手書きで作成するのは少々めんどくさい。そこで二通りのやり方でrequirements.txtを作成してみる。
入力1

cmd or terminal
pipenv requirements > requirements.txt

出力例1

-i https://pypi.org/simple
anyio==3.7.0
click==8.1.3
colorama==0.4.6
fastapi==0.95.2
h11==0.14.0
idna==3.4
pydantic==1.10.8
sniffio==1.3.0
starlette==0.27.0
typing-extensions==4.6.2
uvicorn==0.18.2

入力2

cmd or terminal
pipenv run pip freeze > requirements.txt

出力例2

anyio==3.7.0
click==8.1.3
colorama==0.4.6
fastapi==0.95.2
h11==0.14.0
idna==3.4
pydantic==1.10.8
sniffio==1.3.0
starlette==0.27.0
typing_extensions==4.6.2
uvicorn==0.18.2

作成されたrequirements.txtをpipenv installコマンドを利用して仮想環境に追加すれば良い。

4. pipenvの応用

Pipfileには[packages]や[requires]等の記述があるが同様に[scripts]と記述し実行コマンドを設定すると任意の実行コマンドでシステムを実行できるようになる。具体例を見ながら説明していく。
まず以下のようなディレクトリ構成のシステムがあったとする。

ディレクトリ構成
C:.
 | .python-version
 | main.py
 | Pipfile
 | Pipfile.lock
 | requirements.txt  

main.pyには以下のコードが記述されている。これはPythonフレームワークであるFastAPIの簡単なコードである。
https://fastapi.tiangolo.com/ja/

main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def root():
    return {"message": "Hello World"}

そして仮想環境を生成後に[scripts]を追記したPipfileが以下である。

Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
fastapi = "==0.95.2"
uvicorn = "==0.18.2"

[dev-packages]

[requires]
python_version = "3.11"
python_full_version = "3.11.0"

[scripts]
start = "py -m uvicorn main:app --reload" # 追記部分

ここで追記部分を見るとstartに本来の実行コマンドを割り当てていることが分かる。
 これがきちんと設定できていると、実行時に以下のコマンドを入力するだけでサーバーが起動する。ちなみにpipenv runコマンドはコマンド実行時のみpipenvで生成した仮想環境内で実行するというものである。pipenv run以降に実行コマンドを置くことでシステムを実行しているのである。

cmd or terminal
pipenv run start

やっていることは以下と同様である。

cmd or terminal
pipenv run py -m py -m uvicorn main:app --reload

5. pyenv,pipenvのリセット

pyenv

  • .python-versionファイルを削除することで特定のディレクトリに対するPythonバージョンの指定がリセットされる。

pipenv

6. 参考文献

https://zenn.dev/sql_geinin/articles/29f2b0a5c55db2

  • ChatGPT先生(gpt-4)

Discussion