[覚え書き] Pythonの環境構築について


2018年1月時点での、Pythonの環境構築（インストール、パッケージ管理、仮想環境）についての簡単な覚え書きです。何か間違っているところがあったらお知らせください。

- Pythonには2系と3系があり、互換性がありません。2系はバージョン2.7で打ち止めとなっていて、2020年でサポートが打ち切られます。

---
# **Pythonのインストール**

#### **そもそも各OSのパッケージ管理ソフトについて**

- Linuxでは、UbuntuなどDebian系ではapt、CentOSなどRedHat系ではyum。yumはそのうちdnfとかいうのに移行するそうだ
- macOSではMacportsとHomebrewがあるけど、Homebrewのほうが流行っているのでHomebrewを使っておけば間違いなさそう
    + 使い方についてはこの記事が詳しい： [homebrewとは何者か。仕組みについて調べてみた](https://qiita.com/omega999/items/6f65217b81ad3fffe7e6)
- WindowsにもChocolateyというパッケージ管理ソフトを導入できる。関係ないけど、最近のWindowsはコマンドプロンプトではなくPowerShellとかいうのを使うそうだ

#### **各OSのパッケージ管理を使ったインストール**
基本的に、「[Pythonの環境設定でむかついてる人はとりあえずこれをコピペで実行してください 2017.01](http://ymotongpoo.hatenablog.com/entry/2017/01/26/154124)」 に従えば良さそう。

- Unix系OS（macOS含む）では、システムで使うためにだいたいPython 2が`/usr/bin/python`としてプリインストールされてる。これはシステムで使われているので、いじると大変なことになる。あと、バージョンが古い（2系の最新は2018年1月現在2.7.14）
- macOSでは、2系が`brew install python`で入り、3系が`brew install python3`で入る。それぞれ`python2`と`pip2`、`python3`と`pip3`で使える
- CentOS7では、`yum install https://centos7.iuscommunity.org/ius-release.rpm`でリポジトリを追加してから、`yum install python36u python36u-pip python36u-devel` （数字36はPython 3.6の意味）で入る。`python3.6`, `pip3.6`で使える。develも入れておくと、jupyterでpython 2と3を共存させようとしたときに役立つ
- Windowsでは、`choco install python`で3系の最新が入る。けれど、文字コードか何かの問題でpipが動かなかったりjupyterが起動しなかったりしたので、Windowsは諦めた。VirtualBoxでUbuntuなりCentOSなりを入れよう・・・　。筆者の環境ではどれもうまくいかなかったけど、以下のような対策がある
    + `pip/compat/__init__.py`を手で書き換える（参考：
 https://qiita.com/ruteshi_SI_shiteru/items/be6a58276bdbd67dc096, https://github.com/pypa/pip/pull/4280/files ）
    + Python 3.6以降で文字コードに関する挙動を変えたのが一因か。代わりに、3.6より前の例えば3.5.4を入れる（参考： https://github.com/pypa/pip/issues/4251 ）
    + pipは9が最新だけど、pip 10の開発版を`python -m pip install -U https://github.com/pypa/pip/archive/master.zip`で入れる（参考: https://github.com/pypa/pip/issues/4110 ）

# **Pythonのパッケージ管理**
公式のpipを使うのが無難。2系は2.7.9、3系は3.4から標準でPython本体に付属するようになった。

- CentOS7では、2系に対しては、`yum install epel-release`でリポジトリを追加してから、`yum install python-pip`で入る

#### **使い方**

- `pip install {package}` パッケージのインストール
    + `pip install {package}=={version}` 指定したバージョンのパッケージをインストール
    + `pip install -U {package}` パッケージのアップデート。pip自身に対してもできる
    + `pip uninstall {package}` パッケージのアンインストール
- `pip freeze` インストールされたパッケージの一覧
    + `pip freeze > requirements.txt`として出力しておけば、`pip install -r requirements.txt`でその一覧をインストールできる
- `pip show {package}` あるパッケージについて詳しく見る

#### **入れておくとよいパッケージ**

- `jupyter`, `jupyterlab` インタラクティブコーディング環境
- `scipy` 科学計算。`numpy`も自動で入る
- `pandas` データ分析
- `matplotlib` グラフを描く
- `scikit-learn` 機械学習
- `flake8` コードをチェックする。以下の3つのラッパ
    + `pyflakes` 文法や不要な部分のチェック
    + `pycodestyle`（旧名`pep8`） Pythonのコーディング規約PEP8を守っているかチェック
    + `mccabe` プログラムの複雑さをチェック

#### **conda系について**
データ分析ではAnacondaやMinicondaといったconda系ディストリビューションに含まれるパッケージ管理機能も便利だけれど、公式で決められたwhl形式ではない独自の形式を使っていることについて議論になっているように見える。他にも、bashが前提になっててzshだと困るなどの副作用があるようだ。

- conda系について
    + [Anaconda は Environment Isolation Tool (環境分離ツール) ではない](https://qiita.com/t2y/items/dd6d7f9c70ac2b8a79da#anaconda-%E3%81%8C%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E9%A0%98%E5%9F%9F%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E9%9A%A0%E3%81%99%E3%81%AE%E3%81%AF%E6%82%AA%E3%81%84%E3%81%93%E3%81%A8%E3%81%AA%E3%81%AE%E3%81%8B)
    + [Anaconda で Python 環境をインストールする](https://qiita.com/t2y/items/2a3eb58103e85d8064b6)

- conda系に対する苦言
    + [wheelのありがたさとAnacondaへの要望](http://ymotongpoo.hatenablog.com/entry/2017/02/02/182647)
    + [Pythonの環境構築を自分なりに整理してみる](https://medium.com/@chezou/python%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%82%92%E8%87%AA%E5%88%86%E3%81%AA%E3%82%8A%E3%81%AB%E6%95%B4%E7%90%86%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B-dc8d8f2fe989)
    + [pyenvが必要かどうかフローチャート](https://qiita.com/shibukawa/items/0daab479a2fd2cb8a0e7)


# **仮想環境**
Pythonに入れておくパッケージのセットを、状況に応じて好きに切り替えられるようにする機能。公式のvenvを使うのが無難っぽい。これは、virtualenvというやつがPython 3.3から公式に取り込まれたもの。`pyvenv`コマンドで呼び出す方法は非推奨になった。代わりに、`venv`コマンドを使う。

- `python -m venv {dir}` 仮想環境ディレクトリを作る
    + オプション`-m`は、ライブラリモジュールをスクリプトとして実行する
    + ディレクトリがなければ作ってくれる
    + 2系には`venv`が無いので、`pip install virtualenv`して`virtualenv {dir}`を代わりに使う
- `source {dir}/bin/activate` その仮想環境を有効化する。プロンプトに仮想環境名が表示されるようになる。一時的に環境変数$PATHに`{dir}/bin`が一番左（一番優先順位が高い）に追加され、`python`, `pip`コマンドでその仮想環境のpython, pipを実行するようになる
    + Windowsでは、`{dir}\Scripts\activate.bat`
    + bashで書かれているので、fishシェルでは代わりに`source {dir}/bin/activate.fish`とする
    + `source`は`.`でもいい
- `deactivate` 仮想環境を無効化する

pyenvというのもあるけれど、これが本当に必要な人は限られてるっぽい。

- 参考: [Pythonの仮想環境構築 2017.01版](http://ymotongpoo.hatenablog.com/entry/2017/01/29/002039)
- 参考: [pyenvが必要かどうかフローチャート](https://qiita.com/shibukawa/items/0daab479a2fd2cb8a0e7)