python: pyenvを導入して特定のバージョンのPythonを動かせるようにする for Ubuntu

この記事について

本記事では、マシン上で任意のバージョンが実行できるようになる pyenv のインストールから簡易的な利用方法まで記載していきます。

Pythonに限らず、プログラミング言語はバージョンに依存して新機能が導入されたり、 特定の機能が廃止方向に進んでwarningが表示されるようになってしまったり、といった事象がつきもの。そこで、どんな環境でも特定のバージョンでプログラムを動かすようにできれば、こういった悩みから解放されるはず。

こういった機能は「仮想環境 (virtual environment)」と呼ばれる機能で提供されることが多いです。仮想環境自体は実行環境のバージョンや付随するもろもろのライブラリのバージョンまでまとめて管理するものを指しますが、ここではその実行環境のバージョンを固定する方法を解説しています。

Ubuntu 20.04 で確認。

pyenv は Rubyで同様のことを実施できる rbenv からのforkで作成されたようです。

関連記事: rbenvのインストール方法

pyenv 導入方法

ダウンロード

公式リポジトリに書いてある通りに実施すればOK。かいつまんで書くと、

git clone https://github.com/pyenv/pyenv.git ~/.pyenv
# 以下はBash向け拡張機能のコンパイルなので必須ではない。
cd ~/.pyenv && src/configure && make -C src

上記で pyenv のダウンロードと配置、およびbash向け拡張機能のコンパイルが完了。

PATH 設定

続いて、 pyenv が使えるように PATH を通してあげます。 echo コマンドの内容を指定したファイルにリダイレクトする形で書き込みます。

※ bash 以外を利用されている場合は公式リポジトリ参照。

# ~/.bashrc に設定を書き込み
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

# 同じことを ~/.bash_profile にも書くのが確実、とのことなので
# 同様のことを実施
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

rbenv では GUIを使っているか否かで .bashrc に書くのか bash_profile に書くのかが決定されていたのですが、ここでは両方に書くのがおすすめされています。なのでしたがっておきます。

注意事項

公式手順通りに、上記の通り ~/.bash_profile に書き込んでみたのだが、SSH接続した際にターミナルに色がつかなくなってしまった。
調べてみたところ、Ubuntuは .bash_profile の代わりに .profile を準備しており、そちらを読むようになっているのだが、 .bash_profile を自力で作成してしまうとそちらを読むようになってしまい、起動時に .bashrc を読む動作がスキップされてしまうようだ。

そのため、私は実際には .profile の中に上記のコマンドを記述した。

シェルの再起動

シェルを再起動することで上記の設定を反映させます。

再起動が面倒な場合はシェルを以下コマンドで立ち上げるなどで対応は可能。

exec "$SHELL"

確認

インストールが完了したか確認してみます。

pyenv -v

成功すると以下のようにバージョンが表示されます。

pyenv 2.3.3

pyenv を利用して python のインストール

pyenv を利用して python をインストールしてみましょう。

事前準備

Ubuntu 20.04 ではおそらく以下のパッケージをインストールしておかなければ後のPythonインストール時に警告が出されます。

sudo apt install libbz2-dev libncurses-dev \
  libffi-dev libreadline-dev liblzma-dev \
  libz-dev libssl-dev

インストール可能なバージョンを表示する

インストール可能な python のバージョンを表示するには以下。

pyenv install -l

インストール可能なバージョンがすべて出てきてしまうので、かなり長いです。

特別な理由がなければ 3.10.6 などの数字だけのものが Python の通常
バージョンなので、一番数値が大きいもの(最新のもの)を入れましょう。

pyenv を利用して python をインストール

pyenv install <version> という形式です。

pyenv install 3.10.6

ソースをダウンロードしてコンパイル実行するためなかなか時間がかかります。

インストール済で 利用可能な python バージョンを一覧表示

インストールが完了したら、念のため確認。

pyenv versions

こんなのが出ます。* がついているものが現在システムでデフォルトとなっている python バージョンです。この場合 Ubuntu にデフォルトで入っているものがデフォルトになっています。

* system (set by /home/ubuntu/.pyenv/version)
  3.10.6

pyenv で現在のログインユーザが使うデフォルト python のバージョンを指定する

せっかくなので、インストールしたバージョンをデフォルトで利用するように変更します。 pyenv global コマンドを利用します。

pyenv global 3.10.6

pyenv で特定のディレクトリでのみデフォルト python のバージョンを指定する

pyenv local <version> の形式で、実行したディレクトリ以下でのpythonバージョンを固定します。

pyenv local 3.10.6

pyenv を利用してインストールした python をアンインストール

pyenv uninstall <version> という形式です。

pyenv uninstall 3.10.6

おわりに

pyenv はPython実行環境のバージョンを固定するもので、これだけでも非常に有用な代物ですが、これに加えて最初に記載したような仮想環境を提供するライブラリとして virtualenv というものがあります。これを利用すると実行環境 (Python本体) のみならず、関連する色々なライブラリ (pip install で入れるもの) のバージョンまで固定できるため非常に便利です。

virtualenv については Raspberry Pi向けの記事ですが、内容には大きく相違ないはずですのでこちらをご覧ください: virtualenvwrapperの導入 for Rasbian

コメント

このブログの人気の投稿

gnuplot: グラフの色を変更する

[Linux] rsyncで進捗を確認する

gnuplotで縦線を引きたい