【pyenv+poetry】Pythonで簡単に仮想環境を作成しよう

# はじめに

今まで私はAnaconda/minicondaで仮想環境を作成してきましたが、企業利用においてはどちらも有償化してしまいました。
そこで今回は今モダンだと思われる**pyenv+poetryでの環境構築を書いていきます。**　
pyenv+poetryの解説記事はまぁまぁ多いと思ったが、ぱっと見どういうこと？？とよくわからない記事が多いと個人的には感じたので、初心者でもわかるように途中図示交えながら解説を行う。

※本記事は全面わかりやすくリニューアルして再投稿しました

- 動作環境
・ OS : Windows10 pro
・pyenv 2.2.4
・poetry 1.1.13

# 1.導入

## 1-1.pyenv-winの導入
pyenv自体はwindowsに対応してないため、pyenv-winの導入が必要になる。
`※pyenvとは、pythonのバージョンを簡単に切り替えるツールのこと`

[公式](https://github.com/pyenv-win/pyenv-win)ではpipでのインストールも書かれているが、後でややこしくなる(うまくバージョンが切り替えられない等)あるので以下ではpip以外の2方法をお勧めしておく。

**※以下1-1-1か1-1-2のどっちかの方法で準備してください**

### 1-1-1.gitコマンド
git使えるならこれがオススメです。

```:PowerShell
git clone https://github.com/pyenv-win/pyenv-win.git "$HOME/.pyenv"
```

### 1-1-2.Zipでダウンロードしディレクトリ配置
https://github.com/pyenv-win/pyenv-win/archive/master.zip
よりZIPでダウンロードし、解凍後中身(pyenv-win-masterの中身)を.pyenvディレクトリを$HOME直下に作成し配置する。
そして図のように環境変数を設定する ※ほかのpythonより上に配置することが重要

![スクリーンショット 2022-02-23 123238.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/570620ec-0eb5-79dd-457a-a635c763035e.png)



$HOMEのpath調べ方は

```:PowerShell(コマンドプロンプト)
echo %HOMEPATH%
```

## 1-2.poetryの導入
`poetryとは、pythonのパッケージ管理ツールのことで仮想環境とかも作成可能`

powershellを開き、以下コマンドを実行する

```:PowerShell
(Invoke-WebRequest -Uri https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py -UseBasicParsing).Content | python -
```

すると、.poetryディレクトリが$HOME直下に出力されていることがわかる。

これで準備は完了。

# 2.プロジェクト(仮想環境)の設定とjupyterへの適用

**2-3にイメージが湧くように全体像を記載した。**
2-0～2-2まででやってることはそこで理解できると思うので、まずはこの通りやってみてほしい。

## 2-0.pyenv管理フォルダを作成しておく

適当なフォルダを作成し、そこにcdコマンドで移動しておく。
**以下でプロジェクトを作成していくが、そのプロジェクトで使用するpythonのバージョンを適応させる範囲を限定させる為のフォルダ**

```:コマンドプロンプト
mkdir *** ・・・(1)
cd *** ・・・(2)
```
(1)：pyenvのpythonバージョン管理用ヂィレクトリの作成(***は適当な名前)
(2)：作成したディレクトリへ移動しておく

## 2-1.pyenvで使用するpythonを設定する

pyenvのコマンドと説明はざっくり以下に記載しておく。

|コマンド  | 内容 |
|---|---|
|pyenv install --list |pyenvでインストール可能なpythonのバージョンを確認|
|pyenv versions |pyenvでインストール済のpythonバージョン一覧を表示|
|pyenv install *** |pyenvで未インストールなpythonバージョンをインストール(***にバージョン指定)|
|pyenv rehash |shimファイル(.pyenv\pyenv-win\shims)の中身を更新して再構築|
|pyenv local ***|直下で使用するpyenvのpythonバージョンを設定しておく(***にバージョン指定)|
|pyenv global *** |global環境で使用されるpyenvのpythonバージョンを設定(***にバージョン指定)|
|pyenv which python |今のディレクトリで操作するpyenvのpythonバージョンを確認|


以下では実際に新規で作成していく流れだけ記載する　
※2-0に引き続き以下を順番にコマンドを打ち込んでいく

```:コマンドプロンプト
pyenv install --list  ・・・(1)
pyenv versions   ・・・(2)　※必要に応じて実行
pyenv install ×××  ・・・(3)　※必要に応じて実行
pyenv rehash  ・・・(4)　※必要に応じて実行
pyenv local 3.9.6   ・・・(5)
pyenv which python   ・・・(6)
Python –V  ・・・(7)
```
(1)：現状インストール済のpythonバージョン一覧を表示
(2)：インストール可能なpythonのバージョンを確認
(3)：(1)で使用したいpythonバージョンが無ければ(2)を参考に新規インストールする
(4)：shimファイルの再構築
(5)：2-0で作成したディレクトリ以下の階層で適応するpythonバージョンを(1)から指定(今回は3.9.6とした)
(6)：(5)で指定したpythonバージョンを認識してるか確認
(7)：pyenvコマンドでなくて普通にpythonコマンドでもバージョンを(5)と同じバージョンかを確認しておく

***

**★以下つまづきポイントです**

**もし(6)や(7)で指定したバージョンになってなければ、以下コマンドで環境変数を確認し、
`.pyenv\pyenv-win\shims`がほかのPythonより上に来ているか？を確認する。**

もし下図のようにpyenvのpathが上になければ、コントロールパネルの環境変数をいじって`pyenv-win\bin`、`pyenv-win\shims`が一番上にくるように移動させる※prthは上にある方が優先される為

```:PowerShell
$ENV:Path.Split(“;”)
```


![スクリーンショット 2022-02-23 114055.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/fb382fbf-7663-efff-b2bc-a511e2af5def.png)
***

## 2-2.poetryでプロジェクト(仮想環境)を作成

poetryのコマンドと説明はざっくり以下に記載しておく。

|コマンド  | 内容 |
|---|---|
|poetry config --list  |Poetryの設定を確認|
|poetry config --local virtualenvs.in-project true |プロジェクト単位で仮想環境を設定する(おすすめ設定)|
|poetry new ××× |プロジェクト(ディレクトリ群)を作成(×××にプロジェクト名を入れる)|
|poetry init |pyproject.tomlを対話的に作成する|
|poetry install  |仮想環境の立ち上げ ※pyproject.tomlのあるディレクトリで要実行|
|poetry env info |現在作動している仮想環境の基本情報を確認|
|poetry run python -–version   |poetry内で動作するpythonのバージョンを確認(pyenvと同じはず)|
|poetry add 〇〇〇 |パッケージをインストール  |
|poetry remove 〇〇〇 |パッケージのアンインストール |
|poetry show  |インストール済パッケージ一覧を確認  |
|poetry run python ***.py |仮想環境内でプログラムを実行※コマンド単位で仮想環境を適応 |
|poetry shell |仮想環境に入る※↑とは違い環境に入り込む |
|poetry env list |アクティブな仮想環境の詳細を確認 |
|exit |poetry shellで入り込んだ仮想環境から抜ける |
|poetry self update |poetry本体をアップデート |

以下では実際に新規で作成する流れを記載する。
**今回はテスト環境等が不要なので、あえてnewコマンドを使用しない。**
※newコマンドでプロジェクトを作成すると、余計なテスト用ライブラリが勝手にインストールされる為
※newを使用しない例が具体的に書かれているサイトが無かったため

```:コマンドプロンプト
poetry config --list ・・・(0)
poetry config --local virtualenvs.in-project true  ・・・(1)　※必要に応じて実行
mkdir sample_project  ・・・(2)
cd sample_project  ・・・(3)
poetry init   ・・・(4)
poetry install ・・・(5)
poetry env info ・・・(6) ※必要に応じて実行
poetry env list ・・・(7) ※必要に応じて実行
poetry show  ・・・(8) ※必要に応じて実行
poetry add 〇〇〇  ・・・(9)
poetry show  ・・・(10) ※必要に応じて実行
poetry shell  ・・・(11)
＊＊＊(仮想環境内でなにかしら作業)＊＊＊
exit  ・・・(12)
```
(0)：Poetryの設定を確認し、virtualenvs.in-project = trueでなければ(1)を実行
(1)：プロジェクト直下で仮想環境を管理する設定に変更
(2)：2-0で作成したpyenv用フォルダの直下にsample_projectディレクトリを作成
(3)：sample_project階層へ移動
(4)：pyproject.tomlファイル(プロジェクト管理)を新規作成 ※下記補足あり
(5)：pyproject.tomlをベースに仮想環境を作成 ※.venvフォルダが作成される
(6)：作成した仮想環境の基本情報を確認
(7)：アクティブな仮想環境を確認
(8)：仮想環境にインストールされたパッケージを確認(この時点では空のはず)
(9)：パッケージをインストール ※pip同様`=***`でバージョン指定可能
(10)：インストール済パッケージ一覧を確認
(11)：仮想環境に入る
(12)：(11)の仮想環境から抜ける


**※(4)の補足：pyproject.tomlファイルの作成では基本的にエンターキー連打でOK。**
パッケージ名称(プロジェクト名称)は(2)でmkdirで作成した名称と同じになっている。

![スクリーンショット 2022-02-23 121408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/19136df6-c855-7e6c-3552-5e315efcf3cc.png)

**なお、`poetry add ***`で仮にプロジェクト名と同じライブラリをinstallしようとすると「AssertionError」が発生する。
その際は「pyproject.toml」を開いて。`name = "***"の***をライブラリ名と変えればOKです`**


## 2-3.今までの説明を図示すると・・

さて、今までpyenvやらpoetryやら色々なコマンドをポチポチしてきたわけだが、よくわからん。。。という人の為に今までの作業を図示する。**これでpyenvとpoetryの関係や仮想環境のイメージが湧くと思う。**
※フォルダ名称は適当。あくまでわかりやすいように命名しただけです。

* 2-0で作成したのが図で言うpython3.9.6フォルダ
* 2-1で設定したのは図で言う.python-version
* 2-2で設定したのはsample_project以下の作成＋設定 ※poetry.lockはpoetry addすると自動作成される

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/340980cb-2184-846e-f907-f44dd91b9d6b.png" width=90%>


## 2-4.jupyterをインストールして、仮想環境を適応(選択)できるようにする

ここからは例としてさらに実際に作成した仮想環境をjupyterで実行できるように準備してみる。

```:コマンドプロンプト
poetry add ipykernel  ・・・(1)
poetry shell  ・・・(2)
ipython kernel install --user --name=〇〇〇  ・・・(3)
jupyter notebook  ・・・(4)
```

(1)：ipykernelを仮想環境に導入(add)
(2)：仮想環境に侵入
(3)：jupyterのカーネルから作成した仮想環境を選択可能にする ※〇〇〇は2-3の(2)で作成したプロジェクト名。
(4)：jupyterを起動

すると、以下のように仮想環境が選べるようになり、poetryコマンドも中で使用できる。

![スクリーンショット 2022-02-23 121139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373060/d1991532-36a2-25f0-0f59-2f0f05344580.png)

## 2-5.検証し終わったライブラリをrequirements.txtとして出力する

`poetry export -f requirements.txt --output requirements.txt`でrequirements.txtとして出力可能。
これでDockerやクラウド環境へのデプロイ等で簡単に認識させることも簡単になりますね。

# 3.さいごに
いかがだっただろうか？
anacondaを使うのもいいが、最近の流行はpyenv＋poetryだと思ったので記事として書いてみた。
まずは気軽に試してみて個人で使いやすい方を選んでいけばいいと思います。
それでは今回はここまで。よい仮想環境ライフをお過ごしください。

# 4.追記

## 4-1.Python要件の互換性
`The current project's Python requirement～～`でエラーが出たときは、エラーコードの中の以下の部分を見る
「 For ＊＊＊(ライブラリ), a possible solution would be to set the `python` property to ">=3.9,<3.11"」

⇒この場合`pyproject.toml`を以下のように書き換えればいい

```:pyproject.toml
[tool.poetry.dependencies]
python = ">=3.9,<3.11"　　←ここを書き換える
```

## 参考リンク集
https://github.com/pyenv/pyenv

https://github.com/pyenv-win/pyenv-win

https://github.com/python-poetry/poetry

https://cocoatomo.github.io/poetry-ja/

https://org-technology.com/posts/python-poetry.html