Python環境構築ベストプラクティス2019

Published at: 2019-02-18 / Updated at: 2019-05-14

Web上には新旧さまざまなPython環境の構築の方法が乱れており, 正しい情報にたどり着けない人がいて不憫なので2019年2月現在のベストプラクティスをPythonを使いたい人の属性ごとに紹介したいと思います.
自分がどのような環境を作ればいいかわかったなら公式ドキュメントというほぼ絶対的な1次資料を元に最高の環境を作っていきましょう.

For Beginners

とりあえずPythonを勉強してみたい, 手軽に手元にあるデータを解析してみたいという人はこちらです.
プログラムをガリガリ書いていくのではない場合, 自分のPCに環境構築する必要はありません.
Googleが提供しているColaboratoryを使いましょう.
苦労することなくPythonを始めることができます.
流行りの機械学習, とりわけ深層学習をやってみたいという場合, 無料でGPU, TPUを使えるのも最高です.

For Windows Users

茨の道です. WSLを導入してUbuntuその他Linux環境を整えましょう.
WSLが使えるようになったら次のセクションに進んでください.
また, ちょっと試してみたいけどColaboratoryでは物足りない, でもWSLは難しいという場合はMinicondaを使うといいです.

For Most People (Unix Users)

大多数の人がここに当てはまります. Pythonでプログラミングをしたい学生, 社会人, 手元のデータを解析したい研究者, 機械学習をやりたい人, アプリケーションを作りたい人などとにかくほとんどの人です.

世の中には脳死でpyenv, virtualenvを入れようだとか機械学習ならAnacondaを使おうだとか言ってる人(さすがに最近は死滅したか?)がいますがこれらのツールは必要ありません.
LinuxでもMacでも構いませんがPython3.6以上をシステムにインストールしてください. 3.5以下はレガシーです. これらを使っている人は考古学者であることを自覚してください.
Ubuntuなら$ sudo apt install python, macなら$ brew install pythonのコマンドで入るやつです.
自分のmacにHomebrewが入っていなければ入れておきましょう.
ちなみにHomebrewはLinux環境にも対応したので, 社内, ラボ内の共有サーバー上で環境構築したい, でもsudo権限がなくてPythonの化石しか使えないというときに利用してみてもいいと思います.
ターミナルに$ python -Vと打ってPython 3.7.xと出ればOKです.

次にライブラリの管理です.
人々はPython標準ライブラリに飽き足らずnumpyscipy, matplotlib, requests, flask, djangoといった外部ライブラリを使いたくなるでしょう.
これらの管理にはpipenvを使います.
公式のインストール方法に従えば良いのですが, 該当者が多いと思われる方法を記しておきます.
macなら$ brew install pipenvでインストールしましょう.
その他の環境であれば$ pip install pipenvのコマンドでインストールできると思います. 適宜sudoをつけて実行してください.
これ以降二度とpipは使いません.
他サイトの$ pip install fooは全て$ pipenv install fooに置き換えましょう.

pipenvはプロジェクト固有のライブラリ空間を構成してくれます.
例えばProjectAでは機械学習を使ってなんかやりたい, ProjectBではウェブアプリを作りたいみたいな場合, プロジェクトごとにディレクトリを分けそれぞれのルートディレクトリでpipenvを実行します.

$ cd projectA
$ pipenv install numpy pandas ...
$ cd projectB
$ pipenv install django ...

このときPipfile.lockというファイルができますが, これを用いることで他のPC上で全く同じライブラリ空間を再構成することができます. (Pipfile, Pipfile.lockがある状態で$ pipenv sync)
つまり他人が自分の書いたコードを使いたいとき, 同じ環境を完全に再現することができるようになります.
自分の実装を公開した際, 他人による追試が簡単になりますね.
なお, このPipfile.lockは絶対に自分で編集しないでください.

pipenvでインストールしたライブラリを使いたい場合,

$ pipenv shell
$ python

もしくは$ pipenv run pythonとして起動してください.

長くなったので要点をまとめます.

  • システムのPythonを使う
  • pipenvでライブラリの管理を行う

これで最高のPython環境が整います.

For Library Maintainers

ライブラリを作成するなど複数バージョンのPythonを切り替えなければいけない人はpyenvで必要なPythonのバージョンを入れた上でpipenvを導入しましょう.

For Cheminformaticists…

RDKitを使わなくて済む人は幸せです. For Most Peopleを参考にしてください.
使わなければいけない人, 残念ながらMinicondaを入れてください. 修羅の道です.
RDKitに限らない任意のpip (pipenv)でインストールできないライブラリに依存する場合, Minicondaを受け入れてください.

For Docker Lovers

お好きに使ってください.
GPUを使って深層学習やりたい人はnvidia dockerを使うと便利です.
CPU上ではpipenvのみを用いて環境構築, GPU用にDockerで実行環境だけ整えるといった運用が自分の好みです.

まとめ

pipenvを信じ, 使いこなしましょう.

Appendix 1

Pythonにはコーディング規約があり, これに従わないコードは煩雑で見にくいものとなります.
コードが規約に従っているかチェックするライブラリにはいくつか種類がありますが, flake8を入れておけば他には必要ありません.
慣れてきたらflake8-isort, hackingなどの拡張を入れてもいいですね.
しかしこれらを手動で修正していくのは退屈で時間の無駄なのでformatterというのにやらせましょう.
Pythonのformatterにはyapfblackというものがあります.
基本的に好きなものを使うと良いと思いますが, 私はyapfを好んで使っています.
VSCode等のエディタの設定でファイルを保存する際にコードを綺麗にしてくれるようになるのでおすすめです.

こういった自分が書いたコードが使わないライブラリ群はpipenv install --dev fooとしてインストールできます.

Appendix 2

最後にPipfileの参考例を掲載しておきます.

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]
flake8 = "*"
yapf = "*"

[packages]
numpy = "*"
scipy = "*"
pandas = "*"
sklearn = "*"
seaborn = "*"

[requires]
python_version = "3.7"