Windows で複数バージョンの Python を使う

※ Windows 10 のバージョン 1903 から、 Python がデフォルトで入っています。
※ そのため、 `C:\Users\{ユーザー名}\AppData\Local\Microsoft\WindowsApps\python.exe` がデフォルトで Path に登録されていて厄介なので注意してください。
※ Python をインストールするフォルダを決めていればどのバージョンが入っているか把握できますが、分からなくなった時のためにコマンドを追記しました。
※ Python をよく使うようになってきたので、 `venv` を追加しました。

Python のバージョン管理と言ったら、 pyenv が主流っぽい気がします。
あんまり詳しく知りませんが・・・
でも、 pyenv って Python2.7 とかで使えるイメージがあります。
そして、 Windows の場合は普通に [公式ページ](https://www.python.org/) から 64bit 版の Python の最新版を落としてインストールすると、当然 Python3.7 （執筆時点）とかが入って、 Python2.7 も落としてきてインストールしても、 Path を通せるのはどちらかになりますよね。

ちなみに Windows 10 で環境変数をいじるためには、Windowsキー + i を押して設定を開き、検索窓に「システムの詳細」って入れれば「システムの詳細設定の表示」が出ますので、Windows 7 の時のように環境変数の Path に Python の実行ファイルのあるフォルダと Lib フォルダやら Scripts フォルダやらを追加すればコマンドプロンプトで python と打てば実行できるようになりますよね。
※ システムのプロパティは、Win + R で「ファイル名を指定して実行」から、 `sysdm.cpl` と入力しても開けました

しかし、環境変数に書いてしまうと当然バージョンの切り替えは環境変数に依存してしまいます。
そこで、今回ご紹介する方法を使います。
（これもググっていて見つけたものなので、ご存知の方も多いかもしれませんね）

# まずは普通に Python をインストールする

Windows に、普通にインストールします。
Path の設定とかはしません。
標準的なインストールでも構いませんが、実行ファイルの場所を把握するためにインストールするフォルダは指定することをお勧めします。

# 別のバージョンの Python もインストールする

例えば最初に Python3.7 をインストールしたとしましょう。
その次に、例えば Python2.7 をインストールしましょう。
ここで、 Python3.7.1 を入れた後に Python3.7.2 を入れたら Python3.7.1 は上書きされるので、最低限マイナーバージョンは異なるものをインストールする必要があります。
なので、 Python3.7 と Python3.6 をインストール、でも構いません。
必要なバージョンの Python をインストールします。

# コマンドプロンプトで実行

Path を通していないので、コマンドプロンプト上で `python -V` と入れても、何も反応しないと思います。
以下のようなイメージです。

```:コマンドプロンプト
C:\Users\hoge>python -V
'python' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

今までは Path を通すことによって、このコマンドを使えるようにしていました。
それが、以下のコマンドを使うと解決することが分かりました。

```:コマンドプロンプト
C:\Users\hoge>py -V
Python 3.7.2
```

`py` というコマンドが使えます。
バージョンを指定して実行する場合、以下のようにします。

```:コマンドプロンプト
C:\Users\hoge>py -2.7 -V
Python 2.7.15

C:\Users\hoge>py -3.7 -V
Python 3.7.2
```

指定しない場合、インストールされている最新のバージョンで動作するようです。
また、 `pip` を使うときは、以下のようにします。

```:コマンドプロンプト
C:\Users\hoge>py -2.7 -m pip freeze
autopep8==1.4.3
configparser==3.7.1
future==0.17.1
futures==3.2.0
jedi==0.13.2
mccabe==0.6.1
parso==0.3.2
pluggy==0.8.1
pycodestyle==2.5.0
pydocstyle==3.0.0
pyflakes==2.1.0
python-jsonrpc-server==0.1.2
python-language-server==0.22.0
rope==0.11.0
six==1.12.0
snowballstemmer==1.2.1
yapf==0.25.0
```

python コマンドでモジュールを指定するときと同じ感じですね。
`pip install` も、同じようにバージョン指定でそれぞれ入れることができます。
インストールされる先は、きちんとそれぞれの Python のフォルダの中になるため、 Atom などのエディタで Python の補完機能を使う場合は使いたいバージョンの python.exe を指定するだけです。
指定しなければいけないのはちょっと残念ですが。。。

# インストール済みのバージョンが分からなくなったら

自分はCドライブ直下に`Python`というフォルダを作成してそこにいつもインストールしていたのですが、Dドライブにもフォルダを作ってそこにもインストールしていたことに、つい最近気づきました。
そして64bit版だとバージョン指定が若干異なるようなので、じゃあバージョン指定ってどうすればいいの、という時に以下のコマンドを実行しましょう。

```:コマンドプロンプト
d:\>py --list
Installed Pythons found by py Launcher for Windows
 -3.9-64 *
 -3.7-64
```
`py --list` と入力すれば、選択可能なバージョンが一目で分かりますね。

# venv

お手軽に Python でプログラムを書いていると、ライブラリは Windows 上の Python に直接インストールするやり方をやめたくなってきました。
なので、 `venv` を使うことにしました。
そんなに難しい使い方はしておらず、サクッと構築していきます。

例えばプロジェクトフォルダが以下だとします。

```
D:\program_src\python\myapp
```

コマンドプロンプトで以下のようにします。
（ドライブの移動があるので、`/d` オプションを付けています）

```:コマンドプロンプト
cd /d D:\program_src\python\myapp
py -m venv .venv
```

このコマンドにより、 `D:\program_src\python\myapp` 配下に `.venv` フォルダが作成されます。
あとは venv をアクティベートしてあげればOK。（コマンドは続きから）

```:コマンドプロンプト
.venv\Scripts\activate
```

すると、コマンドプロンプトがこんな感じになるかと思います。

```:コマンドプロンプト
(.venv) D:\program_src\python\myapp>
```

こうなったらそのまま `pip` が使えます！

```:コマンドプロンプト
(.venv) D:\program_src\python\myapp>pip install requests
```

抜けるときは、 `deactivate` します。

```:コマンドプロンプト
(.venv) D:\program_src\python\myapp>deactivate
```

これのいいところは、 VSCode でこの .venv フォルダを認識してくれるので Windows 上の Python に直接ライブラリをインストールしなくても flake8 のコード解析が使えるところですね。
プロジェクトごとに色々と pip install している場合に便利です！

ちなみにフォルダの名称を `.venv` にしなくても、 VSCode では認識してくれました。
なので、以下でも問題なかったです。

```:コマンドプロンプト
py -m venv hoge
hoge\Scripts\activate
```

# 余談

当然ながら、 `py` コマンドが使える以上、どこかに py.exe があるはずです。
それを `where` で探してみると、以下になりました。

```
C:\Users\hoge>where py
C:\Windows\py.exe
```

特に何のひねりもなく、普通の場所にありますね。
Python をインストールした際に、インストール先のフォルダとは関係なく `C:\Windows\py.exe` は配置される、ということでしょうかね。
インストール時に何か書いてあるのかもしれませんが・・・
※ よく見たら、インストール時に書いてありました

ということで、 Windows 好きがなるべく Windows を使いたいがための記事でした。