no-image

Python のバージョン管理、pyenv のインストールと使い方

今まで Python 2.xで開発を行っていましたが、Python 3.x に移行する必要があって 2.x と 3.x が混在する環境をどう構築するか悩んでいました。pyenv や virtualenv, pyvenv という便利なものがあるようですが、それぞれ役割が違うようです。

今回はバージョン管理だけを行いたかったので、pyenv に絞った内容です。

簡単な説明

pyenv  が主に行うのはユーザー環境下での Python のバージョン管理です。ユーザー環境下であってシステム全体ではないところが重要で、システムを利用する他のユーザに影響を与えません。

以下は提供サイト(https://github.com/pyenv/pyenv)にある説明です。

pyenv does...

  • Let you change the global Python version on a per-user basis.
  • Provide support for per-project Python versions.
  • Allow you to override the Python version with an environment variable.
  • Search commands from multiple versions of Python at a time. This may be helpful to test across Python versions with tox.

特定のディレクトリで使う Python のバージョン(per-project Python versions)、それ以外のディレクトリで使う Python のバージョン(global Python version) を簡単に切り替えられるのが特徴です。仕組としてはシェルの PATH の探索順を利用しているようです。

インストール

環境は Debian (Raspbian) 8.0 を想定しています。

インストールといってもシェルスクリプトなので、git からコピーして環境変数を設定するだけです。

# pyenv installのとき必要になるパッケージのインストール
$ sudo apt update
$ sudo apt install build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils

# gitのインストール(gitが入っていたら不要)
$ sudo apt install git

# pyenvのインストール
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

# 環境変数の設定
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source ~/.bashrc

# 確認
$ pyenv -v
pyenv 1.2.4-2-gdad0fc7

簡単な使い方

まず最初にインストールされているバージョンを確認します。

$ pyenv versions
* system (set by /home/pi/.pyenv/version)
$ python -V
Python 2.7.9

何もインストールしてないので、システムに標準で入っている Python のみ状態です。この状態から pyenv 環境に使いたいバージョンの Python を追加していきます。

インストールできる Python のバージョンは "pyenv install -l"  または "pyenv install --list"で確認できます。

$ pyenv install -l
Available versions:
 2.1.3
...
...(省略)...
...
 stackless-3.5.4

この中から、例えば Python 3.6.5 をインストールするなら次のようにするだけです。ビルドを伴うのでそれなりに時間がかかります。

 $ pyenv install 3.6.5
Downloading Python-3.6.5.tar.xz...
-> https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz
Installing Python-3.6.5...
Installed Python-3.6.5 to /home/pi/.pyenv/versions/3.6.5

$ pyenv versions
* system (set by /home/pi/.python-version)
 3.6.5

インストールが完了したらバージョンを切り替えてみます。現在のディレクトリにだけ効力を持たせるには local を、全てのディレクトリで効力を持たせるには global を指定します。

$ pyenv local 3.6.5
$ python -V
Python 3.6.5

local の挙動

local は指定したディレクトリ以下(子ディレクトリも含む)で効果を持ちます。そのディレクトリだけでなく、子ディレクトリにも影響が及ぶことに注意します。

$ python -V
Python 2.7.9
$ pyenv local 3.6.5
$ python -V
Python 3.6.5
$ cd ..
$ python -V
Python 2.7.9
$ cd ./user/dir/
$ python -V
Python 3.6.5

global の挙動

global はそのユーザがログインしているとき、全てのディレクトリで効果を持ちます。どのディレクトリに移動しても、global で指定されたバージョンが実行されます。このとき、local でバージョンが指定されているディレクトリは local で指定したものが優先されます。

$ python -V
Python 2.7.9
$ pyenv local 3.6.5
$ python -V
Python 3.6.5
$ cd ..
$ python -V
Python 3.6.5
$ cd ./user/dir/
$ python -V
Python 3.6.5

Python の仮想環境

Python のバージョン管理を行う pyenv の説明は以上です。2.x と 3.x の共存や切替はこれで簡単に行えますが、環境が複数になると次はプロジェクト毎にモジュールの管理を行う必要が出てきます。

そこで冒頭に挙げた virtualenv や venv といったものが登場します。これらはまた別の記事にまとめます。