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を手動でインストールすることで解決。
Raspberry Piのハードウェアバージョンと、Raspberryのバージョンの確認
手元にあったRaspberry Pi 3Bを使用して確認。 設定方法については下記を参照。
インストールを確認したRaspberry PiのハードウェアとRasberry Pi OSのバージョンは以下のとおり。
$ 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
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
実行結果は下記のようになった。
古いバージョンのRaspbianではopensslの問題でうまくインストールできなかったが、最新のRaspberry Pi OSでは問題なくpyenvから以下でインストールできた。
$ pyenv install -v 3.9.6
globalに設定
$ pyenv global 3.9.6
以下を参考にインストール
$ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
$ echo 'eval "$(pytnv virtualenv-init -)"' > ~/.profile
利用可能なPythonのバージョンの確認
$ pyenv install -list
インストール済みのPythonのバージョンの確認
$ pyenv versions
必要なバージョンのインストール
$ pyenv install 3.9.6
グローバル設定
$ pyenv global 3.9.6
ローカル設定
$ pyenv local 3.9.6
環境の削除
$ pyenv versions
$ pyenv uninstall <version>
$ 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
を設定した例
$ cd test_app1
$ pyenv local 3.9.6_test_app1
$ pip install ...
$ pip freeze > requirements.txt
$ 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
$ pyenv versions
$ pyenv uninstall 3.9.4_test_app2
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
以下のようにして簡単にインストールできるかと思われたが・・・
$ 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を両方アップデートする羽目に陥った。
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
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を読めるようにするのを忘れずに!
$ 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 -)"
ここまでくれば、pyenvを使ってpythonをインストールできる。
$ CONFIGURE_OPTS="--with-openssl=/usr/local/" pyenv install -v 3.9.6
globalに設定
$ pyenv global 3.9.6
$ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
$ echo 'eval "$(pytnv virtualenv-init -)"' > ~/.profile
利用可能なPythonのバージョンの確認
$ pyenv install -list
インストール済みのPythonのバージョンの確認
$ pyenv versions
必要なバージョンのインストール
$ 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
したいバージョン名
グローバル設定
$ pyenv global 3.9.6
ローカル設定
$ pyenv local 3.9.6
環境の削除
$ pyenv versions
$ pyenv uninstall <version>
$ 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
$ 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
$ pyenv versions
$ pyenv uninstall 3.9.4_test_app2