Python 環境構築いろいろ - Linux


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/) の調査結果の方から引用しています。また、以下ではこれらを単に「調査結果」と省略して記載しています。

## "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/)

どちらを選択するかは、例えていえば定食が好みであればAnacondaを使えばいいし、一品料理を自分でセットするのが好みであれば"Vanilla" Python を使えばいいということになるのではないでしょうか。

## 日本で pyenv を使っている人が多い理由

調査結果では、環境構築に pyenv を使っている人は 6% ですが、日本では pyenv を使っている人がそれよりも随分多いように思います。自分で pyenv を使ってみて便利だと思ったのは、CPythonを始めとして、Anaconda、pypy, stackless 等各種のPython処理系のあらゆるバージョンを簡単にインストールできることです。この機能が必要な人といえば、受託でプログラミングをしている人が一番に考えられます。受託の場合は、発注先の仕様でどのPythonのどのバージョンのものを使用するか決まっているので、それに合わせて環境を作る必要があるためです。日本はプログラムの受託開発が多い国なので、そういうことだなと思っています。

pyenv の欠点といえば、Pythonの一般的な使い方では必要がないということです。それで、自分はすぐに削除しました。

例えば、Numpy等を使ってデータ分析の仕事をしている人が、Pythonのバージョンを頻繁に変更することはあるでしょうか。新しいバージョンが出たら適当な時期にアップデートするだけでしょう。Pythonのマイナーバージョンの更新は 1 年半毎なので、 1 年半に 1 回だけ新しいバージョンのものを新規でインストールし、古いバージョンのPythonは不要になるまで置いておくのが普通だと思います。

"vanilla" Python の場合には、マイクロバージョンだけが違う場合はアップデートされ、マイナーバージョンが違う場合は新規にインストールされます。マイクロレベルだと完全に後方互換性があるので、一般的にはアップデートで問題は生じないようになっています。なお、Python のバージョン番号の仕組みは、[一般 Python FAQ](https://docs.python.org/ja/3/faq/general.html) で次のように記載されています。

>Python のバージョン番号は A.B.C や A.B のように付けられています。 A はメジャーバージョン番号で、言語の本当に重要な変更の時のみ上げられます。 B はマイナーバージョン番号で、そこまでは大きくない変更の時に上げられます。 C はマイクロレベルで、バグフィックスリリースの度に上げられます。

そのため、新しくPythonを始めるのであれば、最新版だけインストールすればよく、継続して開発・運用しているのであれば、必要なマイナーバージョンのPythonをインストールしておくば済みます。マイナーバージョンのサポート期間はリリース後5年間で、現在サポートされているバージョンは、2.7, 3.4, 3.5, 3.6, 3.7 ですが、3.4は、2019年3月16日にサポート期限がきます。また、2.7は、2010年にリーリースされ、それから非常に長い間使われてきましたが、2020年1月1日にとうとうサポートが終了します（[PEP 373 -- Python 2.7 Release Schedule](https://www.python.org/dev/peps/pep-0373/)）。

## 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 が使いづらい時代もあったのは事実ですが、既に大きな問題は改善されて、残っているのは、それぞれの文化の問題なので使い方を工夫すればいいだけのことです。 

## Linux を使う場合

Linux を使う場合の注意点を少し、自分が使っている Ubuntu を例にして書きます。

Ubuntu-18.04 が今年の4月にリリースされましたが、Pythonは、2.7, 3.6, 3.7 のパッケージが用意されています。通常の利用であれば、この３つのバージョンがあれば十分だと思います。また、Python3.6 は既にインストールされているので、'python3' とコマンドをたたけば直ぐに利用することができます。

Linux の場合は、システムにインストールされている Python は、システムで使われているので、それにパッケージを追加する場合は、'sudo apt install' を使うのが基本になります。勝手に 'sudo pip3 install' でインストールすると、システムの Python を使っているアプリケーションが動作しなくなる可能性があります。システムが用意しているパッケージはバージョンが古いものが多いので、仮想環境を作成して、そこに自分で 'pip3 install' で使用するパッケージをインストールして使うといいです。

#### C/C++コンパイラーをインストールする
build-essentialパッケージを使って基本的な開発ツールをインストールしておきます。なお、`python3-pip`パッケージをインストールすると Python の開発に必要なツール一式がインストールされるのでそれでも対応できます。Linux の場合は、ソースをコンパイルしてからインストールしないといけない場合でも、共有ライブラリの管理方法が決まっているので、比較的容易です。

```
sudo apt update
sudo apt install build-essential
```
#### Python 等のインストール

既定の状態では、python3.7 仮想環境を作成する venv はインストールされていないので、次のようにして必要なものをインストールします。 

```
sudo apt install python3-venv              # Python3.6用の venv のインストール
sudo apt install python3.7 python3.7-venv  # Python3.7及びそれ用の venv のインストール
```

パッケージに存在しないバージョンの Python が必要な場合は、python.org から Linux 用のソースコードをダウンロードして、自分でコンパイルしてインストールします。'build-essential' が既にインストール済みであれば、Python3.5 の場合は以下でインストールできます。少し慣れると簡単インストールできます。

```
# 必要な開発用のライブラリーをインストール
sudo apt install libreadline-dev libncursesw5-dev libssl-dev libsqlite3-dev libgdbm-dev libbz2-dev liblzma-dev zlib1g-dev uuid-dev libffi-dev libdb-dev
# GUIを使用する場合は、'tkinter' が動作するように追加
sudo apt install tk-dev

wget https://www.python.org/ftp/python/3.5.6/Python-3.5.6.tar.xz
tar -xf Python-3.5.6.tar.xz
cd Python-3.5.6/
./configure
make -s
sudo make altinstall
```
Python各バージョンは次のコマンドで実行できます。単に `python` とすると python2.7 の方が起動するので Python3 を使いたい場合は `python3` とする必要があります。

```
python       # デフォルトの python で python2.7
python2      # デフォルトの python2 で python2.7
python2.7    # python2.7
python3      # デフォルトの python3 で python3.6
python3.6    # python3.6
python3.7    # python3.7
```

#### 仮想環境の利用
仮想環境を作成するには、venv モジュールを使います。`python3 -m venv` のように仮想環境を動かす Python インタープリタを指定するので、Python インタープリタを取り違えることが少なくなります。例えば、'.venv' とい名前の仮想環境をカレントディレクトリーに作成するのであれば以下のようにします。

```
niji@first:~$ python3 -m venv .venv
```
python2 の場合は、`venv` ではなくて `virtualenv` を使いますが、venv は、 virtualenv が標準モジュールとして組みこまれたもので、機能としては同じものです。

```
niji@first:~$ python -m virtualenv .venv
```

仮想環境を使用するためには有効化が必要です。有効化等は、次のようなコマンドでおこないます。

```
niji@first:~$ source .venv/bin/activate  # 仮想環境の有効化
(.venv) niji@first:~$ deactivate     # 仮想環境の停止
niji@first:~$ . .venv/bin/activate   # source の代わりに '.' が使用できる
````

一般的には仮想環境はプロジェクト単位で作成しますが、Linux の場合であれば、自分が普段使用するパッケージをインストールした仮想環境を作成しておくと便利です。自分の場合は、.pyenv をもじった .pyenvs というフォルダーを作成して、そこにその仮想環境や仮想環境の作成に関するメモをまとめてあります。そしてgitで管理しています。そのような仮想環境の作り方を簡単に説明しておきます。

まず、普段使用するパッケージのリストで、'requirements.txt' を作成します。普通 'requirements.txt' にはバージョンを指定しますが、この場合は、最新のパッケージがインストールされればいいので単に次のように名前だけのリストで問題ありません。

```
numpy
pandas
scipy
matplotlib
scikit-learn
jupyter
jupyterlab
```
そうしておけば、

```
niji@ubuntu-pc:~$ python3 -m venv .pyenvs/.myenv3.6
niji@ubuntu-pc:~$ . .pyenvs/.myenv3.6/bin/activate
(.myenv3.6) niji@ubuntu-pc:~$ pip install -r .pyenvs/requirements.txt
``` 
このままだと、毎回 `.pyenvs/.myenv3.6/bin/python`と入力しないと起動できず不便なので、エイリアスを使います。'.bashrc' ファイルに以下を追加します。

```
alias mypy3='$HOME/.pyenvs/.myenv3.6/bin/python3'
```
`mypy3`とコマンドを入力するだけで、自分が普段使用するパッケージがインストールされたPythonを起動することができます。 

```
niji@ubuntu-pc:~$ mypy3
Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
```

ついでに jupyterlab を起動するエイリアスを次のように追加しておくと`mylab`とコマンドを打つだけで jupyterlab が起動するようになるので便利です。

```
alias mylab='$HOME/.pyenvs/.myenv3.6/bin/python3 -m jupyterlab'
```

作成した仮想環境を削除するには、そのフォルダを削除するだけです。

### Anaconda のインストール

Ubuntuの場合は、"vanilla" Python を使っても困ることはないので、Anacondaを使う理由は少ないとは思いますが、Intel MKL とそれでコンパイルされた Numpy が使えるので、データサイエンスや機械学習に集中したい人にはいい選択肢だと思います。

AnacondaのことをPATHを上書きしてOSのライブラリーを勝手に取り替える凶悪仕様といっていた人もいますが、もう、Linux版のAnacondaでは、'anaconda/bin' ディレクトリーを PATH に追加しなくなっています。以下で、Anaconda、Miniconda のインストール及び環境構築を順番にみていきますが、問題になるところはないと思います。

インストールは、次のコマンドでできます。Anacondaの方は、https://repo.anaconda.com/archive/ にダウンロードの一覧があるので、適当なものを選択しますが、基本的には最新のものをインストールすれば、後でPythonのバージョンは変更できます。

```
# Anaconda の場合
wget https://repo.anaconda.com/archive/Anaconda3-5.x.x-Linux-x86_64.sh
bash Anaconda3-5.x.x-Linux-x86_64.sh
# Miniconda の場合
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
```

インストールの途中で、次のようなメッセージが表示されるので、インストールの場所を指定することが可能です。インストールの場所を変えることにより、Anaconda、Miniconda は、一つのマシンにいくらでもインストールすることが可能です。

```
Anaconda3 will now be installed into this location:
/home/niji/anaconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/home/niji/anaconda3] >>>
```
その後で`.bashrc`にPATHを設定するかどうか聞いてくるので'no'にするようにします。

```
# Anaconda の場合
Do you wish the installer to initialize Anaconda3
in your /home/niji/.bashrc ? [yes|no]

# Miniconda の場合
Do you wish the installer to prepend the Miniconda3 install location
to PATH in your /home/niji/.bashrc ? [yes|no]
```
よくみると、Anaconda の方は、Linux版では、`.bashrc`で Anacondaの/binにPATHを設定するのを止めて、以下のコードが`.bashrc`に追加されるので、conda コマンドだけを有効するようになっています。

```
# added by Anaconda3 5.3.1 installer
# >>> conda init >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$(CONDA_REPORT_ERRORS=false '/home/niji/anaconda3/bin/conda' shell.bash hook 2> /dev/null)"
if [ $? -eq 0 ]; then
    \eval "$__conda_setup"
else
    if [ -f "/home/niji/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/home/niji/anaconda3/etc/profile.d/conda.sh"
        CONDA_CHANGEPS1=false conda activate base
    else
        \export PATH="/home/niji/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda init <<<
``` 

実際は、`conda.sh`の方も必ずしも使う必要はありません。`venv`の場合と同じように以下のようにして環境の有効化やPythonの起動が可能です。

```
source ~/anaconda3/bin/activate   # Anacondaの環境の有効化
~/anaconda3/bin/python3           # AnacondaのPythonを起動
source ~/miniconda3/bin/activate   # Minicondaの環境の有効化
~/miniconda3/bin/python3           # MinicondaのPythonを起動
```
上のように毎回入力するのが面倒であれば、エイリアスを使えばいいだけのことです。