今まで Python 2.xで開発を行っていましたが、Python 3.x に移行する必要があって 2.x と 3.x が混在する環境をどう構築するか悩んでいました。pyenv や virtualenv, pyvenv という便利なものがあるようですが、それぞれ役割が違うようです。
- Pythonの環境管理ツール良し悪し - Zopfcode
- Pythonの仮想環境構築(2017年版) pyenvとpyenv-virtualenvとvirtualenvとvirtualenvwrapperとpyvenvとvenv - Qiita
- [Python] pyenvを使ってPythonの複数のバージョンを使い分ける - YoheiM .NET
今回はバージョン管理だけを行いたかったので、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 といったものが登場します。これらはまた別の記事にまとめます。