Python

Pythonのバージョン管理をする方法とpyenvの使い方

Ubuntu 16.04にpyenvをインストールしてPythonのバージョン管理を可能にしてみましょう。Ubuntu18.04、WSLでも同様に可能です。

インストールします。

git clone https://github.com/pyenv/pyenv.git ~/.pyenv

~/.bashrcへ追記します。

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"

if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi

ここで注意があります。以下の通り、echo $BASH_ENVにて~/.bashrcが出力されるようであれば、~/.bashrcへ上記コードを追記するのはやめたほうがいいらしいとのことです。その代わりに、~/.bash_profileへ追記をします。

僕の環境では~/.bash_profileは作っておらず、またBASH_ENVも未定義であったので、無視して.bashrcへ追記をして使っていますが、問題は出ていません。

General warning: There are some systems where the BASH_ENV variable is configured to point to .bashrc. On such systems you should almost certainly put the abovementioned line eval “$(pyenv init -)” into .bash_profile, and not into .bashrc. Otherwise you may observe strange behaviour, such as pyenv getting into an infinite loop.

再起動します。

bash

以下の通り、Pythonをpyenvでインストールする前に、依存関係のプログラムをインストールしてくれとあります。

Install Python build dependencies before attempting to install a new Python version.

Python環境がすでにある方は問題ないかと思いますが、Python自体インストールしていないという方はこれらをインストールしておく必要がありそうです。
実際に検証していませんが、だいたい以下のコードを実行しておけば問題ないかと思います。

sudo apt-get install -y python3-pip python3-dev # for Python 3.n
pip3 install --upgrade pip

以下で任意のバージョンのPythonをインストールできます。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_d4710de5-0596-4374-8545-eb6de25ad46a.png

pyenv install 3.6.7
pyenv install 2.7.12

pyenv globalで使用するPythonのバージョンを指定します。これで、自動でpythonpython3コマンドがpyenvにオーバーライドされたことになります。

$ pyenv global 2.7.12 3.6.7
$ pyenv versions
  system
* 2.7.12 (set by /Users/yyuu/.pyenv/version)
* 3.6.7 (set by /Users/yyuu/.pyenv/version)
$ python --version
Python 2.7.12
$ python2.7 --version
Python 2.7.12
$ python3.6 --version
Python 3.6.7

pyenvでバージョンを変更する前には失敗していたコマンドが…

$ python3 --version
Python 3.5.2

$ epy 'regex_match("hoge","hoge")'
  File "/mnt/c/pg/epy.py", line 28
    if ( re.match(rf"{regex}", text, re.M) ) : return True
                            ^
SyntaxError: invalid syntax

エラーなく成功するようになりましたね。

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_5057c581-fc3b-405b-92e2-ac9f4aedbe36.png

$ python3.6 --version
Python 3.6.7
$ python3 --version
Python 3.6.7
$ epy 'regex_match("hoge","hoge")'
$