pyenvとpipenvの導入方法をまとめる(Windows版)
概要
- Dockerを使用しないといけないレベルではないが、Python関連の環境を管理したい、またはすぐに共有したい場合にpyenvとpipenvが便利なので導入方法をまとめる。
前提
- OS:Windows
- 状態:Pythonをインストール済み, cmdでpipが使用できる
目次
- pyenv, pipenvとは?
- pyenv, pipenv導入方法(Windows版)
- 実際にpyenvとpipenvを使ってみる
- pipenvの応用
- pyenv,pipenvのリセット
- 参考文献
1. pyenvとpipenvとは?
pyenvとpyenv-winについて
- pyenvはPythonのバージョン管理ツールで、複数のPythonのバージョンを一つのシステム上で管理することができる。pyenvを使うと、システム全体ではなく特定のプロジェクトだけで特定のPythonのバージョンを使用することができる。
- pyenv-winはWindowsで動作するpyenvのフォークのことを指している。元のpyenvはLinuxとmacOSを対象にしているが、pyenv-winはそれをWindowsでも使えるように拡張したものである。
pipenvとは?
- pipenvはPythonのパッケージ管理ツールで、パッケージの依存関係を管理し、仮想環境を作成する機能を提供する。
- pipenvはPipfileとPipfile.lockを使ってパッケージの依存関係を明示的に管理する。これにより、パッケージの依存関係を明確にし、再現性のある開発環境を構築することが可能になる。
2. pyenv, pipenvの導入方法(Windows版)
pyenvの導入
Step1. pyenv-winをインストールする
pyenvをWindowsで使用する時は、公式が提供しているpyenv-winを使用する。
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を設定する。
もう一度インストール処理を実行する。
入力
py -m pip install pyenv-win
出力
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で以下のコマンドを入力し、以下の出力が出ることを確認する。
入力
pyenv
出力
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の導入
こちらは非常に簡単
以下のコマンドを実行するだけ
py -m pip install pipenv
3. 実際にpyenvとpipenvを使ってみる
準備ができたのでpyenvとpipenvを使って環境を構築していく。
1. pyenvの設定を行う。
Step1. 利用可能なPythonのバージョンを表示し(実行場所はどこでも良い)インストールする。
以下のコマンドを実行すると
pyenv install --list
このような出力がされる
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をインストールする。
pyenv install ?.?.?(バージョン名)
ここで正常にインストールできたのかを確認するために以下のコマンドを実行し確認する。
入力
pyenv versions
出力例
3.10.5
3.11.0b4
Step2. pyenvでインストールしたPythonをシステムを作成しているディレクトリに固定する。
以下のコマンドでpyenvでインストールしたPythonの中で任意のバージョンを作業ディレクトリ内に適用させることができる。
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バージョンで仮想環境を作成する
以下のコマンドを実行
pipenv install --python 3.10.5
例えば以下のディレクトリ構成においてtestディレクトリで上記のコマンドを実行するとPipfileとPipfile.lockが生成される。
test
|main.py
|.python-version # pyenvで指定したバージョンの記録
|Pipfile # 生成されたファイル
|Pipfile.lock # 生成されたファイル
# 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を利用して仮想環境にライブラリを追加する
仮想環境にライブラリを追加する場合以下のコマンドを実行する。
pipenv install ライブラリ名==バージョン
あらかじめ使用するライブラリが決まっているのであれば、requirements.txtと命名したテキストファイルにライブラリ名とライブラリのバージョンを記述して、以下のコマンドを実行する。
openpyxl==バージョン
pandas==バージョン
pipenv install -r requirements.txt
# 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
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
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の簡単なコードである。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Hello World"}
そして仮想環境を生成後に[scripts]を追記した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
以降に実行コマンドを置くことでシステムを実行しているのである。
pipenv run start
やっていることは以下と同様である。
pipenv run py -m py -m uvicorn main:app --reload
5. pyenv,pipenvのリセット
pyenv
-
.python-version
ファイルを削除することで特定のディレクトリに対するPythonバージョンの指定がリセットされる。
pipenv
6. 参考文献
- ChatGPT先生(gpt-4)
Discussion