Raspberry Piでpyenv & pyenv-virtualenvを使う(2021.7.21, 2021.7.23追記)

Summary

Raspbianの古いバージョン(raspberrypi 4.9.35-v7+)でpyenvを使ってPython 3.9.6をインストールしたところ失敗していたが、最新のRaspberry Pi OS (raspberrypi 5.10.17-v7+)とPyenv 2.0.3-6-gf043f47cでは問題なくインストールできた。

Raspberry Piにpyenvを使ってPython 3.9.6をインストールしようとしたが、OpenSSLのlibが見つからないといわれてインストールに失敗。紆余曲折あったが、結論としてはOpenSSL 1.1.1kとCurlを手動でインストールすることで解決。

pyenv, python-virtualenvのインストール

事前準備

Raspberry Piのハードウェアバージョンと、Raspberryのバージョンの確認
手元にあったRaspberry Pi 3Bを使用して確認。 設定方法については下記を参照。

インストールを確認したRaspberry PiのハードウェアとRasberry Pi OSのバージョンは以下のとおり。

Raspberry Pi Inager

$ cat /proc/device-tree/model
Raspberry Pi 3 B Rev 1.2

$ uname -a
Linux raspberrypi 5.10.17-v7+ #1421 SMP Thu May 27 13:59:01 BST 2021 armv71 GNU/Linux

$ lsb_release -a
No LSB modules are available.
DIstributor ID: Raspbian
Description:    Raspbian GNU/Linux 10 (buster)
Release:        10
Codename:       buster

必要なツールのインストール及びアップデート

$ sudo apt update
$ sudo apt upgrade -y
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev\\
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev\\
xz-utils tk-dev

Raspberry Piへのpyenvのインストール

Macではpyenvとpyenv-virtualenvを次のようにしてインストールできたが、apt-getではインストールできない(インストール方法は後述)

$ sudo brew install pyenv
$ sudo brew install pyenv-virtualenv

しかたがないので別の方法でインストール

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

.bashrcへの設定の追加

$ echo 'export PYENV_ROOT="${HOME}/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="${PYENV_ROOT}/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init --path)"
$ echo 'eval "$(pyenv init -)"

またはviで編集して追加

$ sudo vi ~/.bashrc

実行結果は下記のようになった。

Install pyenv pyenv version

Python 3.9.6のインストール

古いバージョンのRaspbianではopensslの問題でうまくインストールできなかったが、最新のRaspberry Pi OSでは問題なくpyenvから以下でインストールできた。

$ pyenv install -v 3.9.6

globalに設定

$ pyenv global 3.9.6

pyenv version pyenv version

pytenv-virtualenvをインストールする

以下を参考にインストール

$ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
$ echo 'eval "$(pytnv virtualenv-init -)"' > ~/.profile

install pyenv-virtualenv

pyenv, virtualenvの利用方法

あたらしいPythonのバージョンをインストールする

  1. 利用可能なPythonのバージョンの確認

    $ pyenv install -list
  2. インストール済みのPythonのバージョンの確認

    $ pyenv versions
  3. 必要なバージョンのインストール

    $ pyenv install 3.9.6
  4. グローバル設定

    $ pyenv global 3.9.6
  5. ローカル設定

    $ pyenv local 3.9.6
  6. 環境の削除

    $ pyenv versions
    $ pyenv uninstall <version>

開発向けのローカル設定とvirtualenvの設定

特定のアプリ開発のために専用の環境を設定する

$ mkdir test_app1
$ cd test_app1
$ pyenv virtualenv 3.9.6 3.9.6_test_app1
$ pyenv local 3.9.6_test_app1

~/src/test_opencvにvirtualenvで3.9.6_opencvを設定した例

install pyenv-virtualenv

現在インストールされているパッケージのリストを保存する

$ cd test_app1
$ pyenv local 3.9.6_test_app1
$ pip install ...
$ pip freeze > requirements.txt

別のPythonバージョンの環境に切り替えて同じパッケージをインストールする

$ mkdir test_app2
$ pyenv virtualenv 3.9.4 3.9.4_test_app2
$ cd test_app2
$ pyenv local 3.9.4_test_app2
$ pip install -r requirements.txt

現在のvirtualenv環境を削除する

$ pyenv versions
$ pyenv uninstall 3.9.4_test_app2

過去の失敗談はこちら

Raspberry Piにpyenvでpytnon 3.9.6のインストールに失敗!

Raspberry Piのハードウェアバージョンと、Raspberryのバージョンの確認
手元にあったRaspberry Pi 3Bを使用して確認。

$ cat /proc/device-tree/model
Raspberry Pi 3 B Rev 1.2

$ uname -a
Linux raspberrypi 4.9.35-v7+ #1014 Fri Jun 30 14:47:43 BST 2017 armv71 GNU/Linux

$ lsb_release -a
No LSB modules are available.
DIstributor ID: Raspbian
Description:    Raspbian GNU/Linux 8.0 (jessie)
Release:        8.0
Codename:       jessie

事前準備

必要なツールのインストール及びアップデート

$ sudo apt update
$ sudo apt upgrade -y
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev\\
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev\\
xz-utils tk-dev

Raspberry Piでのインストール

以下のようにして簡単にインストールできるかと思われたが・・・

$ sudo apt-get install pyenv

Macではpyenvとpyenv-virtualenvを次のようにしてインストールできたが、apt-getではインストールできない(インストール方法は後述)

$ sudo brew install pyenv
$ sudo brew install pyenv-virtualenv

準備はできたと思い以下のようにしてpyenvでインストールを試みた。しかし!!!

$ pyenv install -v 3.9.6

とやると、以下のようなエラーが出て異常終了してしまう。

ERROR: The Python ssl extension was not compiles. Missing the OpenSSL

apt-getでopensslの再インストールを試みたがダメだったので手動インストールしたが、次にcurlが理由でうまくいかないと言われる。
結果として、OpenSSLとCurlを両方アップデートする羽目に陥った。

pyenvでPython 3.9.6をインストール(成功例)

openssl 1.1.1kのインストール

OpenSSLを手動インストール。インストール先は/usr/local/opensslとした。
以下のサイトを参考にした。

まず、うまくいかなかったものをアンインストール

$ sudo apt remove openssl
$ sudo apt remove pyenv

必要なツールのインストール及びアップデートちょこっと違う。

$ sudo apt update
$ sudo apt upgrade -y
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install -y make build-essential zlib1g-dev libbz2-dev\\
libreadline-dev libsqlite3-dev wget llvm libncurses5-dev libncursesw5-dev\\
xz-utils tk-dev

opensslは複数の脆弱性レポートがあり、現時点では1.1.1kでないと危ないらしい。
~/src/にcdして、サイトの最新版をwgetでダウンロードし展開。 できたopenssl1.1.1kにcdして./configure
--prefix=/usr/localを指定して、--openssldir=/usr/local/opensslとする。
makeしてsudo make installで目的の場所にインストールされる。

$ cd ~/src/
$ wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
$ tar xvzf openssl-1.1.1k.tar.gz
$ cd openssl1.1.1k
$ make distclean
$ ./config shared --prefix=/usr/local --openssldir=/usr/local/openssl
$ make
$ sudo make install

このまま実行するとshared libが見れないと怒られるので、以下でlibc.confに/usr/local/libが記載されていることを確認。

$ cd /etc/ld.so.conf.d/
$ cat libc.conf

さらに、ldconfigしてshared libの登録内容を更新。
version番号が表示されればOK

$ sudo ldconfig -v
$ openssl version
OpenSSL 1.1.1k  25 Mar 2021

curlのインストール

opensslをアップデートすると、古いopensslを参照しているcurlが動かなくなるので、こちらも再インストールが必要。

$ sudo apt remove curl
$ cd ~/src/
$ wget https://curl.haxx.se/download/curl-7.77.0.tar.gz
$ tar xvzf ./curl-7.77.0.tar.gz
$ cd curl-7.77.0/
$ ./configre --prefix=/usr/local/curl/7_77_0 --with-ssl=/usr/local/ --enable-libcurl-option
$ make
$ sudo make install
$ sudo ldconfig -v

最後にsudo libconfig -v してshared libを読めるようにするのを忘れずに!

pyenvのインストール

$ sudo apt install pyenv

.bashrcへの設定の追加

$ echo 'export PYENV_ROOT-"${HOME}/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="${PYENV_ROOT}/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init --path)"
$ echo 'eval "$(pyenv init -)"

Python 3.9.6のインストール

ここまでくれば、pyenvを使ってpythonをインストールできる。

$ CONFIGURE_OPTS="--with-openssl=/usr/local/" pyenv install -v 3.9.6

globalに設定

$ pyenv global 3.9.6

pytenv-virtualenvをインストールする

$ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
$ echo 'eval "$(pytnv virtualenv-init -)"' > ~/.profile

pyenv, virtualenvの利用方法

あたらしいPythonのバージョンをインストールする

特定のアプリ開発のために専用の環境を設定する

  1. 利用可能なPythonのバージョンの確認

    $ pyenv install -list
  2. インストール済みのPythonのバージョンの確認

    $ pyenv versions
  3. 必要なバージョンのインストール

    $ CONFIGURE_OPTS="--with-openssl=/usr/  local" pyenv install 3.9.6

    新バージョンをインストールするたびにCONFIGURE_OPTS="--with-openssl=/usr/ local"とかしないといけない。
    3.6以前をインストールするときは、以下のようにしないといけないかもしれない。

    $ CFLAGS=-I/usr/include/openssl LDFLAGS=-L/usr/lib pyenv install -v install
    したいバージョン名
  4. グローバル設定

    $ pyenv global 3.9.6
  5. ローカル設定

    $ pyenv local 3.9.6
  6. 環境の削除

    $ pyenv versions
    $ pyenv uninstall <version>

開発向けのローカル設定とvirtualenvの設定

現在インストールされているパッケージのリストを保存する

$ mkdir test_app1
$ cd test_app1
$ pyenv virtualenv 3.9.6 3.9.6_test_app1
$ pyenv local 3.9.6_test_app1
$ pip install ...
$ pip freeze > requirements.txt

別のPythonバージョンの環境に切り替えて同じパッケージをインストールする

$ mkdir test_app2
$ pyenv virtualenv 3.9.4 3.9.4_test_app2
$ cd test_app2
$ pyenv local 3.9.4_test_app2
$ pip install -r requirements.txt

現在のvirtualenv環境を削除する

$ pyenv versions
$ pyenv uninstall 3.9.4_test_app2

参考

役に立ったもの

屍の山

Back to Index