数年前に作ったpythonの開発環境を更新する。

本格的にlambdaの学習に取り掛かっています。
lambdaは開発言語が複数ありますが、私に馴染みがあるのは「node.js」と「python」です。
今回は、勉強もかねてpythonに挑戦してみようと思います。

ただ、私の開発環境は数年前にpythonを触ったきりそのまま放置していたので、開発するにはしのびない状態でした。
そこで、開発環境を再構築し直しました。

この記事で得られること 

  • pythonの開発環境作成に必要な知識が得られる   
  • プロジェクト毎にpythonのバージョンを管理できる。

イントロダクション

作業の流れ

  1. pyenvで安定版のPythonをインストール
  2. pyenv-vertualenvでプロジェクト用のpyenvのバージョンを作成
  3. プロジェクトディレクトリに適用

開発環境

  • MacOS High Sierra(10.13.2)を使用
    • pyenv自体はインストールは数年前にインストール済み。

キーワード

  • pip
  • pyenv
  • pyenv-vertualenv

pyenvで安定版のPythonをインストール

pythonの安定板は2017年12月現在では「3.6.4」だったのですが、ローカルのバージョンは「3.5.1」だったので安定板をインストールします。

pyenvでインストールできるpythonのバージョンが低い?

pyenvでインストール可能なバージョンを確認して見ても低いバージョンしかインストールできませんでした。

$ pyenv install --list
... 省略 ...
3.5.1
3.6.0.dev
anaconda-1.4.0
... 省略 ...

そのため、pyenv自体のアップデートを行います。 pyenvはgitで管理されているのでcloneすれば良いのですが、今回はpyenv-updateを使用します。 これで、pyenvのコマンドに含めてしまうこともできます。

$ git clone git://github.com/yyuu/pyenv-update.git ~/.pyenv/plugins/pyenv-update
$ pyenv update

最新版のzlibライブラリが足りなくてインストールできない?

pyenvをアップデートしたことで、pyenv install --listに安定版が表示されました。
次にインストールをしてみたのですがインストールできません。

$ pyenv install 3.6.4
... 処理中 ...

zipimport.ZipImportError: can\'t decompress data; zlib not available
make: *** [install] Error 1

どうやら、zlibが実行できる環境では無いようです。
zlib自体は別途インストールする方法もありますが、macで開発を行う場合はxcodeCommand line toolsをインストールする方法が主流のようです。

developer.apple.com

「Command line tools」は開発に必要な最小限のCLIのライブラリをインストールしてくれます。

Command line toolsをインストール

ドキュメントには下記と記載されています。

Install the Command Line Tools package via the Terminal application
You can install the Command Line Tools package by running the xcode-select --install command.

CLIの場合はxcode-select --installコマンドでインストールできると書いているのでコマンドで実行します。

$ xcode-select --install

実行すると、ポップアップでインストール許可を聞かれるので続行します。

再度新しいバージョンをインストール

しばらくするとインストールが完了しますので、終わったら再度最新版のpythonをインストールします。

$ pyenv install 3.6.4
Installed Python-3.6.4 to /Users/(ユーザー)/.pyenv/versions/3.6.4

## インストールが完了したら、実際に追加されたか確認。
$ pyenv versions
system
2.7.11
* 3.5.1 (set by /Users/<username>/.pyenv/version)
3.6.4

pyenv-vertualenvでプロジェクト用のpyenvのバージョンを作成

この時点で、pythonのバージョンをディレクトリ単位で変える事はできます。
しかし、バージョン毎に切り替えを行うので、pipコマンドでインストールしたライブラリは共有されてしまいます。

もし、2つのプロジェクトがあって、pythonのバージョンが同じだが、ライブラリがそれぞれ違う物を使用している場合はどうでしょうか?
仮にライブラリ間で干渉してしまうものがあった場合、構築の手間になってしまいます。

そこで、pyenv-virtualenvを使ってバージョンを更に、個別のプロジェクトに分けられるようにします。

github.com

ちなみに、pyenv-virtualenvはpyenvのプラグインであって、virtualenvとは別物です。

インストール

macの場合は次の方法でインストールできます。
windowsの場合は、おそらくgitでcloneする方法になるかと思います。   

$ brew install pyenv-virtualenv
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile

バージョンを複製

## 先ほどインストールした3.6.4を複製して、「hogeproject」という名前にします。
$ pyenv virtualenv 3.6.4 hogeproject

## 念のため確認します。
$ pyenv versions
system
2.7.11
* 3.5.1 (set by /Users/<username>/.pyenv/version)
3.6.4
3.6.4/envs/hogeproject
hogeproject (set by PYENV_VERSION environment variable)

プロジェクトディレクトリに適用

これでバージョンとプロジェクト毎に変えられるpythonの環境が作れるようになりました。
最後に、設定したいプロジェクトのディレクトリに作成したバージョンを指定します。

$ cd <project directory>
$ pyenv local hogeproject

これで完了です。
実行すると、pyenv localでバージョンを指定した場合、「.python-version」と言うファイルが自動生成されます。
個別の環境用のファイルは除外しておいた方がよいので、gitのバージョン管理から除外しておいた方が良いです。