Windowsで環境を極力汚さずにPythonを動かす方法 (Scoop編)

## 【はじめに】
なぜか着実にview数が伸びていく「Windowsで環境を極力汚さずにPythonを動かす方法」シリーズ[^1]。
意外に需要があるようなので、最近のお気に入りの方法を記述します。
本手順は過去に紹介したEmbeddable版と異なり `tkinter` や `venv` が利用可能だったり、WSL版のようにHW制限を受けないのが特徴です。
また手順が2stepしかなく、非常に簡単です。

## 【内容】
Windows用のパッケージ管理ツール「Scoop」を利用し、Windows環境を極力汚さずにPythonをインストールして、開発や動作確認を行えるようにします。
**(※ ユーザ環境変数PATHが追加/変更されるので、それが気になる人はここで撤退してください)**


## 【手順】
### 1. Scoopのインストール
まずはパッケージ管理ツール「Scoop」をインストールします。
Scoop自体は非常に軽量なツールであり、Scoopによってインストールされるモジュールはデフォルトではユーザフォルダ内にインストールされるため、Windowsのシステム環境をほとんど汚しません。

Scoopの簡単な導入方法は下記記事を参照してください。
[【Scoopを使った環境構築】- Qiita](https://qiita.com/rhene/items/d8a0c0c7d637904e14da)

とりあえず使うことができればいいという方は、PowerShellから下記コマンドを実行してScoopをインストールしてください。
ポリシー変更のメッセージが出てきたら「Y」を入力して先に進んでください。

```powershell
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
```

### 2. Pythonのインストール
Scoopがインストールできたら、Pythonのインストールを行います。
PowerShellまたはコマンドプロンプトから下記のコマンドを実行してください。

```powershell
scoop install python
```

**以上でPythonのインストールは完了です。**

Pythonを実行するにはコマンドプロンプトなどから `python` または `python3` で起動します。
あとは `pip install` で必要モジュールをインストールするなり、`python -m venv` で仮想環境を作るなり好きにしてください。

なお、本手順でインストールしたPythonは、起動時に `%userprofile%\scoop\shims` 内のコマンドが呼び出されますが、実体は `%userprofile%\scoop\apps\python` に配置されています。



## 【補足 - Pythonのバージョンについて その1】
Scoopによるインストールは基本的に最新版がインストールされます。
例えば `scoop install python` を実行した場合、本記事記載時点(2020/09/02)では `Python 3.8.5` がインストールされます。
別のバージョンをインストールしたい場合には、少し追加で作業が必要になります。

Python `2.7`、`3.5`、`3.6`、`3.7`など古いバージョンが必要な場合は以下を実行してください。

```powershell
scoop install git         # 以下の作業で必要になるため Git をインストールする
scoop bucket add versions # versions bucketの追加
scoop install python37    # python3.7の「最新版」をインストール
```

なお、インストールできるバージョンは上記コマンドで、 `scoop bucket add versions` を実行したあとで `scoop search python` で確認することが出来ます。

```powershell
# パッケージを検索
scoop search python
#=>'main' bucket:
#=>    aws (1.18.44) --> includes 'python.exe'
#=>    python (3.8.5)
#=>    winpython (3.8.5.0)
#=>
#=>'versions' bucket:
#=>    anaconda2 (2019.10) --> includes 'python.exe'
#=>    miniconda2 (4.7.12.1) --> includes 'python.exe'
#=>    python-alpha (3.9.0b5)
#=>    python-beta (3.8.4rc1)
#=>    python27-beta (2.7.18rc1)
#=>    python27 (2.7.18)
#=>    python35 (3.5.4)
#=>    python36 (3.6.8)
#=>    python37 (3.7.9)
```

また、本手順でインストールできるのは各バージョンの最新版のみです。
細かいリビジョンを指定する方法もありますが、ここでは割愛します。

なお、上記で記載したとおりScoopでインストールしたコマンドは `%userprofile%\scoop\shims` のコマンドが呼び出されますが、複数のバージョンをインストールした際には、ここの中が最後にインストールされたものに上書きされ、意図しないバージョンで実行される場合があります。
基本的にはバージョンに応じたコマンドで意図したバージョンで実行することが可能です。
(上記の例の場合は `python` または `python37`)
しかし、共通コマンドである `python3` や `idel/idle3` などのコマンド類は、最後にインストールされたバージョンで実行されてしまいます。
これを修正するためには `scoop reset` コマンドを利用することで `%userprofile%\scoop\shims` 内のコマンド類を修正できます。
上記例の場合では以下のようになります。

```powershell
# 現行バージョンの確認 (最終インストールは3.7.9)
python3 -V
#=>Python 3.7.9

# 3.7.9から最新バージョンに切り替える
scoop reset python
#=>Resetting python (3.8.5).
#=>Linking ~\scoop\apps\python\current => ~\scoop\apps\python\3.8.5
#=>Creating shim for 'python'.
#=>WARN  Overwriting shim to python.exe installed from python37
#=>Creating shim for 'pythonw'.
#=>WARN  Overwriting shim to pythonw.exe installed from python37
#=>Creating shim for 'python3'.
#=>WARN  Overwriting shim to python.exe installed from python37
#=>Creating shim for 'idle'.
#=>WARN  Overwriting shim to idle.bat installed from python37
#=>Creating shim for 'idle3'.
#=>WARN  Overwriting shim to idle.bat installed from python37

# バージョン変更の確認 (3.7.9から3.8.5に変わっている)
python3 -V
#=>Python 3.8.5

# 最新版から3.7系に変更する
scoop reset python37
#=> (出力省略)

# バージョン変更の確認 (3.8.5から3.7.9に変わっている)
python3 -V
#=>Python 3.7.9
```


## 【補足 - Pythonのバージョンについて その2】
私は上記の方法でバージョンコントロールは行っていません。
`%userprofile%\scoop\apps\` に配置されているPythonの希望するバージョンの実体ファイルを直接叩いて、`venv` で開発環境ごとに仮想環境を作って管理しています。

```powershell
# 仮想環境作成例 (PowerShell)
#   コマンドプロンプトで実行する場合は「~」の部分を「%userprofile%」に
#   「activate.ps1」を「activate.bat」に変更してください

# 仮想環境用のフォルダ作成 (必要に応じて適当なフォルダに変更してください)
mkdir c:\venv

##################################################
# Python3.8.5用の仮想環境の作成 (=>c:\venv\python38)
##################################################
~\scoop\apps\python\3.8.5\python -m venv c:\venv\python38

C:\venv\python38\Scripts\activate.ps1    # 仮想環境のactivate
python -V                                # バージョン確認
#=>Python 3.8.5

pip install numpy                        # numpy 「最新」バージョンのインストール
pip install pandas                       # pandas 「最新」バージョンのインストール

pip freeze                               # インストール済みモジュールの確認
#=>numpy==1.19.1
#=>pandas==1.1.1
#=>(以下省略)

deactivate                               # 仮想環境から抜ける


##################################################
# Python3.7.9用の仮想環境の作成 (=>c:\venv\python37)
##################################################
~\scoop\apps\python37\3.7.9\python -m venv c:\venv\python37

C:\venv\python37\Scripts\activate.ps1    # 仮想環境のactivate
python -V                                # バージョン確認
#=>Python 3.7.9

pip install numpy==1.15                  # numpy 1.15のインストール
pip install pandas==1.0                  # pandas 1.0のインストール

pip freeze                               # インストール済みモジュールの確認
#=>numpy==1.15.0
#=>pandas==1.0.0
#=>(以下省略)

deactivate                               # 仮想環境から抜ける


##################################################
# 実環境の確認
##################################################
python -V
#=>Python 3.8.5

pip freeze
#=> (返り値なし)
```


[^1]: [【Windowsで環境を極力汚さずにPythonを動かす方法 (WSL利用 Windows10, version 1607以降限定)】](https://qiita.com/rhene/items/ff11c7850a9a7617c50f)<br>[【Windowsで環境を極力汚さずにPythonを動かす方法 (Python embeddable版)】](https://qiita.com/rhene/items/68941aced93ccc9c3071)