BETA

pythonの環境構築戦争にイラストで終止符を打つ

投稿日:2019-10-27
最終更新:2019-10-27
※この記事は外部サイト(https://qiita.com/ganariya/items/1bf870275...)からのクロス投稿です

はじめに

Pythonの環境構築は僕にとって、戦争でした。

如何せんツールが多すぎます。
インターネットで調べるとざっと挙げるだけで

  • 元から入っているpython3
  • 元から入っているpython3 + venv
  • pyenv
  • pyenv + pyenv-virtualenv
  • pyenv + venv
  • anaconda
  • docker + python
  • docker + anaconda
  • ...

以上のような組み合わせが山程出てきます。

よく最近のゲームのキャラメイキングの
「組み合わせは無限大!」を思い出します。

この記事では、それぞれの環境構築の概念をイラスト画像でまとめようと思います。
環境構築のコマンド自体は取り扱わないためご注意下さい。

元からPCに入っているPython3

これが一番簡単な初期状態です。
ゲームでいう、レベル$1$でRTAなどで一切キャラメイキングしてない状態です。

OSごとにもよりますが、最近のOSには初期状態でPython2やPython3がインストールされています。
当然一つのバージョンしか入っていません。
ここではPython3.7.3を想定して扱っていきます。

Pythonの一つのバージョンには、公式モジュールフォルダと、pipでインストールしたモジュールフォルダがあります。
公式モジュールには

  • math
  • logging
  • venv
  • collections

などPython公式が作ったモジュールが入っています。

一方、pipというPythonのパッケージマネージャでインストールしたモジュールには

  • Keras
  • requests

などサードパーティが作成したモジュール(ライブラリ)などがフォルダで管理されています。

ここで、まず問題になるのがpipでインストールするモジュールのバージョンを切り分けられないということです。
ディレクトリAでは、Keras1.2を使いたいです。しかし、ディレクトリBでは、Keras1.0を使いたいです。
このとき、pipでは同じサードパーティ製のモジュールのバージョンは$1$つしか扱えません。

よって、ディレクトリAで作業する時はKeras1.2を再インストール、そしてディレクトリBで作業する時はKeras1.0を再インストールなど、毎回pipで入れ直す必要があります。
これだと面倒です。
さらに、機械学習では多くのライブラリが依存関係を持っており、そのたびにすべてのサードパーティモジュールをインストールし直す必要があります。

そこで、venvを使用することで、同じバージョンのPython下で複数の環境を作ることが可能となります。

元からPCに入っているPython3 + venv

venvは、一つのPythonのバージョン下で、複数のサードパーティ製のpip環境を切り分けることの出来る、公式モジュールです。
つまり、Python3.7.3の下で、プロジェクトのディレクトリごとに複数のpipサードパーティ環境を作ることができます。

上記の画像を見てみます。
元からインストールされていたPython3.7.3の公式モジュールにvenvというモジュールがあります。mathやloggingと同じ扱いのモジュールです。

venvを使うと、ディレクトリごとにpipのサードパーティライブラリ環境を作ることができます。
よって、上記の画像の通り

  • DesktopのproAというプロジェクトディレクトリでは、Keras1.2をインストールして使う
  • DownloadのBというプロジェクトディレクトリでは、Keras1.5をインストールして使う

のように、複数のサードパーティライブラリのバージョンを切り分けて使うことができます。

ここで、venvの大事なメリットがPythonバージョンx.x.xの公式venvを使うことで、そのx.x.x内部に複数のサードパーティライブラリ環境を作ることができる!ということです。
これによって、バージョンが切り分けられてうま味になります。

しかし、このままではまだ問題があります。
例えば、以下のような状況です。

あなたはPython3.7.3を使っており、Kerasの本を買ってきてディープラーニングの勉強をすることにしました。
しかし、その本ではPython3.6.1の環境を利用していたようです。
ここであなたは気付きました。Python3.7.3内で複数のサードパーティライブラリの環境をつくれても、Pythonのバージョン自体は変えることができないのです。

そこで、pyenvの出番です。

pyenv

pyenvは、PCのOSに複数のPythonのバージョンをインストールできるミドルウェアです。

上記の画像を見てみます。
あなたはpyenvをインストールし、pyenvでpython3.7.3をインストールし通常利用しています。
そして、Kerasの本でPython3.6.1を利用していたため、pyenvでバージョン3.6.1を追加インストールしました。

pyenvで3.6.1に使用バージョンを切り替えることでKeras本と同じ環境にすることができます。
さらに、いつでも別バージョンに戻せる、というpyenvのうま味があるため、Keras本が終わったら3.7.3に戻すことができます。

これは嬉しいですね。
Pythonのバージョン自体を切り替えられるようになりました。

しかし、ここでまた新たな問題が発生します。

あなたはせっかくPython3.6.1に切り替えましたが、Keras本で、Keras1.0を使っている環境とKeras1.2を使っている環境が混ざっていたのです。
ちゃんと一緒に統一しろや!と思いましたが、あなたはpyenvのみではバージョンは切り替えられてもサードパーティ製のライブラリのバージョンを切り替える環境が作れないことに気付きました。

そこで、pyenv + pyenv-virtualenv
または pyenv + venv
の出番になります。

pyenv + pyenv-virtualenv

pyenvでPythonのバージョン自体を切り替えられることを説明しました。
そこで、後はそのバージョンx.x.x内で、複数のサードパーティ製のライブラリを使える環境を切り分けられればよいわけです。

そこで、pyenv-virtualenvというpyenvのプラグインミドルウェアを使うことができます。

pyenv-virtualenvを使うことで、pyenvでインストールしたPythonx.x.x内で複数のサードパーティ環境を作ることができます。
これによって、ディレクトリやプロジェクトごとに利用するライブラリバージョンを変更できます。
また、元々のPythonx.x.xのpipは汚れないため、うま味倍増です。

pyenv + venv

pyenv + venvも同様です。

pyenvで選んだPythonのバージョンx.x.x内の公式モジュールvenvを使うことで、複数のサードパーティ環境を作ることができます。

これでついに

  • 好きなPythonのバージョンx.x.xを使える・切り替えられる
  • そのバージョンx.x.xのライブラリ環境を切り分けられる

ことができるようになりました。

しかし、まだ一応問題は存在します。
それは、PCの環境が汚れるということです。

PythonはOSのミドルウェアとして内部でも利用されています。
そのため、できればOSのPythonは汚さない・いじらないのがベストです。

そこで、Dockerを使うことができます。

Docker + Python

Dockerは、コンテナという小さなLinuxシステムをOS上のプロセスとして動かすことで、自分のPCのOSを汚すことなくアプリやライブラリを利用できるようにしてくれるミドルウェアです。

Pythonコンテナは以下のような感じになっています。

  • alpineLinuxイメージに、Pythonx.x.xのバージョンがインストールされている

よって、alpineOSの上でPythonx.x.xが動いているため、自分のPCのOS(例えばMac)は汚れることが有りません。

PythonのDockerイメージは

  • バージョンx.x.x
  • Anaconda

など多くのイメージが用意されているため、簡単に環境を作り利用できます。
また、Kerasなどの機械学習ライブラリがすでにインストールされたライブラリもあるため、うま味です。

自分のPCの環境を汚したくないときはDockerを利用すると便利です。

最後に

Pythonを取り巻く環境環境の概念について見てきました。
Pythonを利用している期間は僕は短く、まだまだ理解が足りていません。
間違っている点やアドバイスをいただければ嬉しいです!
ありがとうございました!

P.S. Anaconda環境

Anacondaについて、非常に疎いため、「自分が考えているAnaconda環境」を載せます。

上記のような感じかと思っていますが、pip conda ライブラリなどの仕組みがよくわかっていないため詳しい方にぜひ教えてほしいです!

Jupyter Notebookの仕組みもさっぱりです・・・(Anaconda上で動くサーバー?)

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

雑多まとめ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!