Python 環境構築いろいろ - Windows

Python の環境構築についての記事は Qiita でも非常に多く今更とは思うのですが、Python を本格的に使い始めて2年間、いろいろと試行錯誤したので、この機会に纏めてみました。「決定版」と書いてある記事が結構多いのですが、現実に使われているものにはそれぞれに存在価値があると思うし、ベストプラクティスはどういう使い方をするかによって変わってくるものだと思うので、[Python Developers Survey](https://www.jetbrains.com/research/devecosystem-2018/python/) の調査結果を参照しながら書いてみました。なお、Python Developers Survey 2018 の結果は概要しか公表されていないので、詳細なデータは [Python Developers Survey 2017](https://www.jetbrains.com/research/python-developers-survey-2017/) の調査結果の方から引用しています。また、以下ではこれらを単に「調査結果」と省略して記載しています。

（このページは、Windows用にして、Linuxは Python [環境構築いろいろ - Linux](https://qiita.com/yniji/items/2155b77152967a897e15) に移動しました。2019/06/25）

## "vanilla" Python vs Anaconda 

Pythonの開発環境につては、調査結果では、70%の開発者が、Python.org 及び APTやHomebrew 等の OS が提供するパッケージの Python（いわゆる"Vanilla" Python）を利用しています。 

Anacondaを利用している開発者は15%ですが、そのメリットは、自ら "The most popular Python data science distribution" と名乗っているように、データサイエンス向けに最適化されていることです。もし、Python でしたいことが、データー分析、機械学習が中心であれば、いい選択肢になると思います。
![python-installation.png](https://qiita-image-store.s3.amazonaws.com/0/103055/64a1070b-de5e-ef7a-2215-f804971db509.png)
出典 Python Developers Survey 2017 Results [Python Installation and Upgrade](https://www.jetbrains.com/research/python-developers-survey-2017/#python-3-adoption)

下の図はPythonを使って何をしているかのデータですが、予想どおりデータ分析がトップで52%となっています。
![data01.png](https://qiita-image-store.s3.amazonaws.com/0/103055/dcfe42c3-317c-7734-062f-8ebbfd02899a.png)
出典 [The State of Developer Ecosystem Survey in 2018](https://www.jetbrains.com/research/devecosystem-2018/python/)

次の図がどのフレームワークを使用しているかというデータですが、Numpy / matplotlib / SciPy / Pandas 等の科学技術計算用のライブラリーが 47% でトップになっています。次いで、Django, Flask という Web 用のフレームワークが 39% となっています。Anaconda は、25% の開発者が使用しており、Numpy / matplotlib / SciPy / Pandas 等の科学技術計算用のライブラリーを使っている人の半分が使っているという計算になると思います。 
![data04.png](https://qiita-image-store.s3.amazonaws.com/0/103055/53ddd2ee-76fd-c696-630c-3984eeb6d12c.png)
出典 [The State of Developer Ecosystem Survey in 2018](https://www.jetbrains.com/research/devecosystem-2018/python/)

"Vanilla" Python は、以前だと Windows版では、Numpy, Scipyのインストールが難しいという問題等使いづらいという問題があったのですが、現在では、そういう問題も解消し "Vanilla" Python を使ってデーター分析、機械学習をすることに問題はなくなっています。どちらを選択するかは、例えていえば定食が好みであればAnacondaを使えばいいし、一品料理を自分でセットするのが好みであれば"Vanilla" Python を使えばいいということになるのではないでしょうか。

## Pythonを始める時には Google Colab を使おう

Pythonを始める時に、Python のインストールで躓く人も結構いたのではないでしょうか。今は、「Google Colaboratory」を使うと Python をインストールすることなく、Python の学習を始めることができます。ブラウザがあればすぐに使い始められて環境構築が不要なので、これよりも楽な環境構築はないでしょう。Google Colab は、Jupyter Notebookのクラウドサービスで、PythonやNumpyなど、データ分析や機械学習で必要なほぼ全ての環境がすでに構築されています。

使い方は至って簡単で、http://colab.research.google.com/ にアクセスして、Googleアカウントでサインインするだけです。

Python 初心者が、[公式チュートリアル](https://docs.python.org/ja/3/tutorial/)を使って学習するのであれば、「2. Python インタプリタを使う」を飛ばして、「5. データ構造」まで何の問題もなくできると思います。また、GPUも使用できるので、上級レベルの人でも機械学習の学習に使うことが可能です。以下が スペックの概要(GPU 無し)で、一般的なノートパソコンよりもマシン性能は上だと思います。

```
!cat /etc/issue

Ubuntu 18.04.1 LTS \n \l

!cat /proc/cpuinfo

processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 63
model name	: Intel(R) Xeon(R) CPU @ 2.30GHz
---
cpu MHz		: 2300.000
cache size	: 46080 KB
---

processor	: 1
vendor_id	: GenuineIntel
cpu family	: 6
model		: 63
model name	: Intel(R) Xeon(R) CPU @ 2.30GHz
---
cpu MHz		: 2300.000
cache size	: 46080 KB
---

!free -h

              total        used        free      shared  buff/cache   available
Mem:            12G        369M         11G        796K        1.2G         12G
Swap:            0B          0B          0B
```
## Windows vs Linux vs Mac 

調査結果では、Windows PC を使っている人が49%と一番多いです。ただし、linuxのマーケットシェアは、[NET MARKET SHARE](https://netmarketshare.com/operating-system-market-share.aspx)、[Statcounter](http://gs.statcounter.com/os-market-share/desktop/worldwide)によると 2% 以下なので、それと比べると開発者には linux を使って人が断然多いです。
![data02.png](https://qiita-image-store.s3.amazonaws.com/0/103055/27c3e233-3c47-6250-2f22-448e221bd405.png)
出典 Python Developers Survey 2017 Results [Operating Systems](https://www.jetbrains.com/research/python-developers-survey-2017/#developer-profile)

自分も最初は Windows で Python を使っていましたが、特に問題になることはなかったです。ただし、Linux と違ってコマンドラインで使うのが遣りづらいので PyCharm に頼っていた所があったように思います。

Python には、OpenPyXL のように Excel を扱えるライブラリーもあるので、Python で会社の業務データの分析をしている人も多いと思いますが、そういう人の多くは Windows PC を使っていると思います。

どの OS を使うかは、結局は自分の置かれた環境に合わせざるを得ないものだと思います。かっては、Windows で Python が使いづらい時代もあったのは事実ですが、既に大きな問題は改善されて、残っているのは、それぞれの文化の問題なので使い方を工夫すればいいだけのことです。 

## Windows PC を使う場合

Windows PC で Python を使う場合の注意点を少しだけ書いておきます。

"vanilla" Python を使うか Anaconda を使うかは、最初に書いたように好みの問題です。ただし、Web、デスクトップ、組み込み、ゲーム、モバイル等のアプリ開発をする場合は、"vanilla" Python を使ったほうがいいです。Anaconda は、データサイエンス向けのものなので、アプリを開発するために必要なパッケージが不足しています。それらを pip でインストールすることは可能ですが、pip で大量にパッケージをインストールすると二重管理になってしまい問題が発生すやすくなります。でも、"vanilla" Python から Anaconda に移行することも逆に移行することも簡単だし、プロジェクトによって使い分けることもできるので、あまり気にせずに始めたらいいと思います。

### "vanilla" Python を使う

Windowsの場合は、python.orgからバイナリーをダウンロードしてインストール方法に加えて、Microsoft Storeからダウンロード可能になっています。公式ドキュメントの [Microsoft ストアパッケージ](https://docs.python.org/ja/3.7/using/windows.html#the-microsoft-store-package) のページには以下の記述があり、本格的に使うのにはまだ早いようです。

> 注釈: 他のツールや他から提供されている Python が評価されている一方、Microsoft ストアパッケージは現時点で不安定だと見られています。Python そのものは安定しているのですが、そのインストール方法により Python 3.7 リリースの間、振る舞いや機能が変更されるかもしれません。

>Microsoft ストアパッケージは、例えば生徒が主に対話型で使うことを意図した簡単にインストールできる Python インタプリタです。

以下に、python.orgからバイナリーを使う場合に注意しておくことを纏めてみました。

#### C/C++コンパイラーをインストールしておく

Pythonのパッケージは、バイナリーのものが増えてきましたが、まだ、ソースコードをコンパイルする必要があるのものがあります。Build Tools for Visual Studio 2017 をインストールしておきます。インストールについては、Python Japan の「[Cコンパイラのインストール](https://www.python.jp/install/windows/install_vstools2017.html)」のページを参考にしてください。

Windowsでは、パッケージによっては、別のライブラリーにリンクをする必要があって、コンパイルをするのが難しいものがあります。そういう場合には、[Unofficial Windows Binaries for Python Extension Packages](https://www.lfd.uci.edu/~gohlke/pythonlibs/) のページからダウンロードしてくるのも一つの方法です。

また、NumPy は高度に最適化されたライブラリーです。pip で NumPy を入れると OpenBLAS にリンクされたものが入るので、Anacondaの MKL にリンクされたものより処理が遅くなるという話があります。NumPy で浮動小数点の演算を大量にさせるケースでは、Unofficial Windows Binaries for Python Extension Packages を使った方がいい場合があります。この場合は、numpy, scipy, scikit-learn の３つは同じ浮動小数点演算のライブラリーにリンクしたものを使わないとエラーになります。

なお、実際にNumPyの浮動小数点演算の計算時間をはかってみると、最新のIntelのCPUを使っているデスクトップPCだとMKLを使った方が2倍ぐらい速くなりましたが、AWS, GCP, Azure の VM だと 10% ぐらいしか速くなりませんでした。さくらのVPSだと逆にMKLの方が遅くなって、pip で入れた方が速くなりました。MKL版を使うかどうかは稼働環境によって違ってくるのでテストしてからにした方がいいと思います。

#### Python コマンドではなくて py コマンドを使う

python.org からダウンロードした Python をデフォルトでインストールした場合は、環境変数の PATH にPythonの実行ディレクトリーを追加しません。そのため、python とコマンドを打っても、エラーになります。

単一のバージョンの Python だけを使用するのであれば、環境変数の PATH に使用する Python の実行ディレクトリーを追加すればいいのですが、複数のバージョンの Python を使用する場合は、Pythonランチャーを使うようになります。Pythonランチャー 'py.exe'は、'Windows' ディレクトリーにインストールされるので、'py'と入力するだけで実行できます。単に'py'とすると、最新版のPythonが起動されるので、Python3.7までインストールしていれば、以下のようになります。

```
PS C:\Users\Admin> py
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

PS C:\Users\Admin> py -3.6
Python 3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 13:35:33) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
                                                                                                                                                                                                                                                                                  PS C:\Users\Admin> py -2
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 
 
PS C:\Users\Admin> py -0
Installed Pythons found by C:\WINDOWS\py.exe Launcher for Windows
-3.7-64 *
-3.6-64
-3.5-64
-2.7-64
```
Pythonのスクリプトやpip等のPythonのモジュールを実行する場合も、以下のようにPythonランチャーを使います。

```
py -3.6 main.py    # 最新版の場合は、単に py main.py で実行できます。
py -3.6 -m pip install numpy   # Pythonのモジュールを実行する場合は、-m オプションを付けます。 
```                                                                                                                                         

#### アプリを作る時は仮想環境を作ろう

Webアプリの場合であれば、公開サーバーにデプロイする必要があるし、デスクトップアプリであれば単体で実行可能なものにして配布する必要があります。そのため、使用するパッケージをアプリ毎に管理しておく必要があります。そういう場合には、仮想環境を作成します。

仮想環境を作成する場合、Python3 では venv モジュールを使うのが標準です。venv は、 virtualenv が標準モジュールとして組みこまれたもので、機能としては virtualenv と同じものです。 

仮想環境の作成は、仮想環境の名前は何でもいいのですが、ここでは .venv として作成する場合には以下のようにして作成できます。

```
cd project_dir
py -m venv .venv
```
もちろん、Pythonのバージョンを指定して、絶対パスで仮想環境を指定することもできます。

```
py -3.6 -m venv c:\projects\test\.venv
```
仮想環境で使用するするパッケージを requirements.txt に記録しておくと、一括してパッケージをインストールすることができるので便利です。なお、仮想環境で、`pip freeze > requirements.txt`とすると自動生成できます。

```
.venv\Scripts\activate    # 仮想環境の起動
pip install -r requirements.txt  
```

仮想環境の使い方は、以下のようになります。PowerShellを使っていますが問題はなく、プロンプトに仮想環境の名前が表示されるので、仮想環境に入っているかどうかがわかりやすいです。

```
PS D:\opt\app\test-venv> .\.venv\Scripts\activate
(.venv) PS D:\opt\app\test-venv> python
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
(.venv) PS D:\opt\app\test-venv> pip install numpy
Collecting numpy
  Using cached https://files.pythonhosted.org/packages/00/0e/5a8c34adb97fc1cd6636d78050e575945e874c8516d501421d5a0f377a6c/numpy-1.15.4-cp37-none-win_amd64.whl
Installing collected packages: numpy
Successfully installed numpy-1.15.4
(.venv) PS D:\opt\app\test-venv> python main.py
Hello World!
(.venv) PS D:\opt\app\test-venv> deactivate
PS D:\opt\app\test-venv>
```
Python2 では、 virtualenv を使います。 virtualenv は、外部モジュールなので、pip でインストールします。仮想環境を作成する場合は、以下のコマンドで作成しますが、作成後の使い方は venv の場合と全く同じです。

```
py -2 -m virtualenv .venv
```
仮想環境は複雑で、Dockerを使った方が簡単というような記事が Qiita には見受けられますが、仮想環境は1分あれば作れます。仮想環境は、広く使われている機能であり、開発者の75%が使っているものです。

![data03.png](https://qiita-image-store.s3.amazonaws.com/0/103055/0abb7b3b-ae08-9b18-9f2f-26a3d9607f52.png)
出典 Python Developers Survey 2017 Results [Tools and Features for Python Development](https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features)

### Anaconda を使う

Windows で Anaconda をインストールする場合は、[Anaconda のダウンロードのページ](https://www.anaconda.com/download/)からグラフィカルインストーラーをダウンロードしてインストールするのが普通だと思います。Anacondaは、データサイエンスで通常使うパッケージが一括してインストールされるので、データサイエンスをしたい人には便利です。また、Anaconda は、バイナリーのパッケージなので、最初は、Build Tools for Visual Studio 2017 をインストールする手間が省けます。でも、Cython を使い始めるとコンパイラーが必要になってくるので、結局はあまり違いはないかもしれません。

最近の Anaconda のインストーラは、デフォルトだと下の図のように Anaconda の PATH を環境変数に追加しないようになっていて、基本は、Windowsのスタートメニューから使うという設定になっています。
![install11.png](https://qiita-image-store.s3.amazonaws.com/0/103055/ebde33bf-15c2-dace-4da6-1df33d140b2b.png)
Jupyter Notebook と Spyder がメニューに登録されるので、初心者には便利です。

Anaconda の PATH が環境変数に追加しない場合で、PowerShellで Anaconda を利用したい場合、以前は`pscondaenvs`という非公式パッケージを使っていましたが、やっと conda 4.6 で公式に PowerShell に対応しました。Anaconda をインストールするとメニューに Anaconda Prompt だけではなく Anaconda Powershell Prompt が表示されます。

Anaconda での Powershell の設定については、[Anaconda がやっと PowerShell に公式対応した](https://qiita.com/yniji/items/668f805a72a6ced6a2bd) という記事の方に記載したのでそちらをみてください。

コマンドプロンプトから、Anacondaの環境を起動し停止する場合は、以下のコマンドでおこないます。もちろんメニューのAnaconda Pronptから起動するとAnacondaの環境が起動した状態でコマンドプロンプトが立ち上がります。

```
C:\Users\niji>%HOMEDRIVE%%HOMEPATH%\Anaconda3\Scripts\activate  # Anacondaの環境の起動
(base) C:\Users\niji> deactivate   #  Anacondaの環境の停止
C:\Users\niji>                     
```

Anaconda で Python3.7 を使う場合に、直接 Python を起動するとワーニングがでます。numpy インポートしようとするとエラーになるので、Anacondaの環境を起動してから Python を起動するようにします。

```
PS C:\Users\Admin> ~\Anaconda3\python
Python 3.7.3 (default, Mar 27 2019, 17:13:21) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Warning:
This Python interpreter is in a conda environment, but the environment has
not been activated.  Libraries may fail to load.  To activate this environment
please see https://conda.io/activation
Type "help", "copyright", "credits" or "license" for more information.
>>>    
```
直接 Python を起動できなくなると困るのが Excel で xlwings 使う時です。Anaconda の場合は、以下のようにすれば簡単にpython3.6の仮想環境を作成できるので、それを利用すれば大丈夫です。

```
conda create -n py36 python=3.6  # パッケージが空の python3.6 の環境を作成
conda create -n py36 python=3.6 anaconda   # anacondaのパッケージが入った python3.6 の環境を作成   
```
このように簡単に指定したバージョンの Python の仮想環境を作成できるので Anaconda、Miniconda は、最新版をインストールすれば十分です。

```
conda create -n py35 python=3.5            
conda create -n py36 python=3.6 anaconda   # anacondaのパッケージが入った python3.6 の環境を作成
```
環境の移動は次のようにして行います。なおconda4.3までは、単に`activate py36`とcondaをつけませんでした。

```
# conda4.4 以降
conda activate py36　　　# py36 という名前の環境を起動
conda activate base      # ルートの環境を起動
conda deactivate         # 起動している環境を停止
```

#### パッケージのバージョン管理も conda でおこなう
Anaconda でパッケージをインストールする時は原則としてconda install でおこなう必要があります。pip installと混ぜるとパッケージの管理方法が異なるので、環境が壊れることがあります。

[Understanding Conda and Pip](https://www.anaconda.com/understanding-conda-and-pip/)

ここで注意をしなければいけないのは、TensorFlow のような大型のパッケージをインストールする場合です。もし、condaのパッケージなければ pip でインストールする必要があります。その場合に、単に、`pip install TensorFlow` としてしまうと、多くの依存するパッケージがpipでインストールされてしまします。そうなると環境が壊れる可能性が高くなります。依存パッケージをできるだけconda install で先にインストールしておくのが一つの方法ですが、それは結構面倒だし、その後もパッケージ間の依存関係が合わなくあるという問題が発生しやすいので、condaで仮想環境を作ってそこにインストールした方がベターです。

パッケージ関係の主なコマンド

```
conda search PKGNAME=3.1  　　　　　　# パッケージの検索 3.1.x が表示される
conda search PKGNAME=3.1.1 --info   # パッケージの詳細情報の表示
conda install PKGNAME==3.1.1         # バージョンを指定してパッケージをインストール
conda uninstall PKGNAME             # パッケージのアンインストール
conda update --all                  # すべてのパッケージを更新
conda update conda                  # conda の更新
conda clean --all                   # 不要データの削除
conda list                          # インストール済パッケージの一覧
```

### WSL や Vagrant で Linux を使う

Python の学習を始めようとしている人で、Linux PC を持っている人はいないと思うし、Mac を持っている人も殆どいないと思います。でも、将来的には、Linux を使いたいと思っているのであれば、windows でも Windows Subsystem for Linux（WSL） や Vagrant を使うと Linux を簡単に動作させることができるので、それを使いましょう。