📦

Raspberry Pi OS + PyenvでPythonバージョンの切り替え

2022/08/27に公開

OS標準でインストールされているPythonとは異なるバージョンをインストールして用途によって使い分けられるようにPyenvをインストールして切り替えるようにしました。

環境

$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

インストール済Pythonのバージョン確認

$ python -V
Python 3.9.2

Pyenvのインストール

Githubから取得してインストールする方法もあるようですが今回はインストールシェルをダウンロードして実行することにしました。

$ sudo curl https://pyenv.run | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   270  100   270    0     0    253      0  0:00:01  0:00:01 --:--:--   253
Cloning into '/home/hoto/.pyenv'...
remote: Enumerating objects: 992, done.
remote: Counting objects: 100% (992/992), done.
remote: Compressing objects: 100% (429/429), done.
remote: Total 992 (delta 574), reused 707 (delta 436), pack-reused 0
Receiving objects: 100% (992/992), 490.48 KiB | 5.51 MiB/s, done.
Resolving deltas: 100% (574/574), done.
Cloning into '/home/hoto/.pyenv/plugins/pyenv-doctor'...
remote: Enumerating objects: 11, done.
remote: Counting objects: 100% (11/11), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 11 (delta 1), reused 5 (delta 0), pack-reused 0
Receiving objects: 100% (11/11), 38.72 KiB | 267.00 KiB/s, done.
Resolving deltas: 100% (1/1), done.
Cloning into '/home/hoto/.pyenv/plugins/pyenv-installer'...
remote: Enumerating objects: 16, done.
remote: Counting objects: 100% (16/16), done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 16 (delta 1), reused 7 (delta 0), pack-reused 0
Receiving objects: 100% (16/16), 5.88 KiB | 5.88 MiB/s, done.
Resolving deltas: 100% (1/1), done.
Cloning into '/home/hoto/.pyenv/plugins/pyenv-update'...
remote: Enumerating objects: 10, done.
remote: Counting objects: 100% (10/10), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 10 (delta 1), reused 6 (delta 0), pack-reused 0
Receiving objects: 100% (10/10), done.
Resolving deltas: 100% (1/1), done.
Cloning into '/home/hoto/.pyenv/plugins/pyenv-virtualenv'...
remote: Enumerating objects: 61, done.
remote: Counting objects: 100% (61/61), done.
remote: Compressing objects: 100% (54/54), done.
remote: Total 61 (delta 11), reused 27 (delta 1), pack-reused 0
Receiving objects: 100% (61/61), 37.56 KiB | 2.35 MiB/s, done.
Resolving deltas: 100% (11/11), done.
Cloning into '/home/hoto/.pyenv/plugins/pyenv-which-ext'...
remote: Enumerating objects: 10, done.
remote: Counting objects: 100% (10/10), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 10 (delta 1), reused 6 (delta 0), pack-reused 0
Receiving objects: 100% (10/10), done.
Resolving deltas: 100% (1/1), done.

WARNING: seems you still have not added 'pyenv' to the load path.

# Load pyenv automatically by appending
# the following to 
~/.bash_profile if it exists, otherwise ~/.profile (for login shells)
and ~/.bashrc (for interactive shells) :

export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

# Restart your shell for the changes to take effect.

# Load pyenv-virtualenv automatically by adding
# the following to ~/.bashrc:

eval "$(pyenv virtualenv-init -)"

.bashrc修正

ログイン時だけではなくシェル起動時にも反映されるように今回は~/.bashrcに以下の設定を追加

export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

設定を現在のシェルに反映

$ source ~/.bashrc

pyenvのバージョン確認

$ pyenv --version
pyenv 2.3.3

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

インストール可能なpythonのバージョン表示(2022/8/20時点)

$ pyenv install --list 
〜途中省略〜
  3.10.6
  3.11.0rc1
  3.11-dev
  3.12-dev

現在のアクティブなpythonバージョン確認

$ pyenv version
system (set by /home/hoto/.pyenv/version)

python 3.10.6をインストール

$ pyenv install 3.10.6
Downloading Python-3.10.6.tar.xz...
-> https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tar.xz
Installing Python-3.10.6...
WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
WARNING: The Python curses extension was not compiled. Missing the ncurses lib?
WARNING: The Python ctypes extension was not compiled. Missing the libffi lib?
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems


BUILD FAILED (Debian 11 using python-build 20180424)

Inspect or clean up the working tree at /tmp/python-build.20220820185201.4000
Results logged to /tmp/python-build.20220820185201.4000.log

Last 10 log lines:
	 ./python -E -m ensurepip \
		$ensurepip --root=/ ; \
fi
Looking in links: /tmp/tmp6o24axxz
Processing /tmp/tmp6o24axxz/setuptools-63.2.0-py3-none-any.whl
Processing /tmp/tmp6o24axxz/pip-22.2.1-py3-none-any.whl
Installing collected packages: setuptools, pip
  WARNING: The scripts pip3 and pip3.10 are installed in '/home/hoto/.pyenv/versions/3.10.6/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed pip-22.2.1 setuptools-63.2.0

一部のパッケージはインストールされたもののWARNING

不足パッケージをインストール

sudo apt-get install libbz2-dev
sudo apt-get install libncurses5-dev
sudo apt-get install libffi-dev
sudo apt-get install libreadline-dev
sudo apt-get install libssl-dev

python 3.10.6をインストール(リトライ1)

$ pyenv install 3.10.6
Downloading Python-3.10.6.tar.xz...
-> https://www.python.org/ftp/python/3.10.6/Python-3.10.6.tar.xz
Installing Python-3.10.6...
WARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib?
WARNING: The Python lzma extension was not compiled. Missing the lzma lib?
Installed Python-3.10.6 to /home/hoto/.pyenv/versions/3.10.6

python3.10.6はインストールされたもののまだWANING

python 3.10.6をインストール(リトライ2)

一度、python 3.10.6をアンインストール

$ pyenv uninstall 3.10.6
pyenv: remove /home/hoto/.pyenv/versions/3.10.6? [y|N] y
pyenv: 3.10.6 uninstalled

不足のパッケージをインストール

$ sudo apt-get install libsqlite3-dev
$ sudo apt-get install liblzma-dev

python 3.10.6をインストール

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

インストールされているPythonのバージョン表示

$ pyenv versions
* system (set by /home/hoto/.pyenv/version)
  3.10.6

systemはOSにデフォルトでインストールされているバージョン
*は現在のシェルで有効になっているバージョン

バージョンの切り替え

切り替えの有効範囲

オプション 有効範囲
shell 現在のシェル内でのみ有効なバージョン指定
local 現在のディレクトリとそれ以下のディレクトリで有効なバージョン指定
global システム全体でのPythonバージョンを指定する

切り替え(shellの場合)

$ pyenv shell 3.10.6
$ pyenv versions
  system
* 3.10.6 (set by PYENV_VERSION environment variable)
$ python --version
Python 3.10.6

無事インストール完了、次は複数の開発環境に切り替えられるようにpipenvをインストール予定

Discussion