python環境(windows10)

windows10でのpython環境を作成するときの一例

- pyenvでpythonバージョンを切り替える
- パッケージはvenvで個々に管理する


## 全体の流れ
[1.pythonのインストール](#1-pythonのインストール)
[2.pyenv-winのインストール](#2-pyenv-winのインストール)
[3.必要に応じてvenv](#3-必要に応じてvenv)



# 1. pythonインストール
公式のインストーラーでインストール
add pythonXX to PATH にチェックをいれないと面倒なのでチェックを必ず入れる
それ以外はデフォルトのまま
（必要な場合はカスタマイズしてください）


# 2. pyenv-winのインストール

#### pyenv-win
```shell:cmd
pip install pyenv-win --target %USERPROFILE%/.pyenv
```

※ pythonインストール時にPATHに追加し忘れて、C:\Users\ユーザー名\AppData\Local\Programs\Python\Python39だけPATHに手で追加したがpipが動かないので先頭にpython -m をつけて（これ↓）実行した）

```shell:cmd
pipを直接指定して動かない場合
python -m pip install pyenv-win --target %USERPROFILE%/.pyenv
```

※PowerShell（or Git Bash）の場合は変数の名前が異なる。（\$HOMEを使用する）

```powershell:powershell
pip install pyenv-win --target $HOME\.pyenv
```


これで、C:\Users\ユーザー名\.pyenv が作成される。


この２つのパスをPATHに追加する
C:\Users\ユーザー名\.pyenv\pyenv-win\bin は存在しているが 最初はshimsは無い。

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

手で追加してもいいし、次のpowershellでやってもよい
（手で追加の場合は、先頭におくこと。
　既存の "C:/Users/[user]/AppData/Local/Microsoft/WindowsApps" これより先に位置していないと、pythonコマンドを叩くとMicrosoftストアが表示されてしまう）

```powershell:powershell(管理者実行が必要)
[System.Environment]::SetEnvironmentVariable('PATH', $HOME + "\.pyenv\pyenv-win\bin;" + $HOME + "\.pyenv\pyenv-win\shims;" + $env:Path,"Machine")
```


※多くの解説記事にこれも書いてあるけどなくても動くかも
環境変数の「PYENV」に
%USERPROFILE%\\.pyenv\pyenv-win
を手で追加。または次のpowershell

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

新しくcmdかpowershellを立ち上げて（新しく立ち上げないと今設定した環境変数が反映されない）
正しく設定されているか確認。

```
pyenv --version
pyenv 2.64.6.1
```

利用できるバージョンの確認

```
pyenv install --list
または
pyenv install -l

（ずらずらと利用可能なバージョンが表示される）
```

使いたいバージョンを入れる

```
pyenv install 3.7.9
：
pyenv install 3.9.4
```
使いそうなものをいくつか入れておけば、瞬時に切り替えられる。（後述）

installしたものは、versionsで確認できる

```
pyenv versions
3.7.9
3.9.4
```

切り替えるときは

```
pyenv local 3.9.4
```
<code>local</code> を使って切り替える。
<code>local</code> はユーザごとの環境を変えるコマンド。全ユーザに影響するのは<code>global</code> 。
（私は<code>local</code>しか使ったことがない）

このコマンドを叩いたディレクトリに.python-versionという、バージョン番号が書かれたファイルが作成される。
その場所でpythonを実行するときは.python-versionに書かれたバージョンのpythonが実行される。

**用途やプロジェクトに応じて、pythonのバージョンを切り替えられる。**

現在設定されているバージョンの表示は

```
pyenv version
さっきのはversionsで複数形だったがこっちは単数形
```




バージョンがうまく切り替わらないとか、問題が発生した場合

```
pyenv rehash
```
今のところ使ったことはない。


#3. 必要に応じてvenv
仮想環境を作る
仮想環境ごとにパッケージを管理できるので、
用途やプロジェクトごとにそれ用のパッケージをインストールできる。

プロジェクトA：pandas1.0、numpy1.8
プロジェクトB：pandas1.2、numpy1.19

を使いたい場合とかに以下のように２つ仮想環境作って、切り替えて使用する。

プロジェクトA -> 仮想環境A
プロジェクトB -> 仮想環境B

仮想環境は任意の場所にフォルダ名（仮想環境名）を指定して作成できる。

```shell:cmd
python -m venv <任意の名前>


この名前にすることが多い
python -m venv .venv

```


切り替えるときはその場所のスクリプトを叩く。


```shell:cmdまたはVSCodeのターミナルなど
仮想環境名/Scripts/activate.bat



```

```json:settings.json
// VSCodeでは ".vscode\settings.json" にこのスクリプトが実行されるように設定する
{
  "python.pythonPath": ".venv\\Scripts\\python.exe",

/* お好みで
  "python.linting.flake8Args": [
    "--max-line-length=120",
    "--max-complexity","20"
  ],
  "python.dataScience.textOutputLimit": 0,
  "editor.mouseWheelZoom": true
*/
}
```



Anaconda、virtualenv、pipenvなどpythonの環境管理はさまざまありますが、いろいろ試した結果この形に落ち着きました。