ラズパイへのPython3.9.7のインストール ※少しハマったのでまとめ


本記事の内容

  • ラズパイへのPython 3.9.7へのインストール

実施環境

  • Windows 10
  • TeraTarm Version 4.9.4
  • Raspberry Pi 2 Model B
  • PLANEX 無線LAN子機 GW-USNANO2A ※Raspberry Pi 2はWi-Fi通信モジュールがないため、無線LAN子機をUSBに接続しWi-Fi通信を行う。
  • 家庭内の無線LANネットワーク環境にて実施

ラズパイの現状確認

初期状態のラズパイでpythonコマンドを実行すると、バージョンが2.7.16だったので最新版へアップデートを行う。

pi@raspberrypi:~ $ python --version
Python 2.7.16

もう少し見てみるとpython3.7も入っているようだ。
現時点での最新版である3.9.7へのアップデートを行うことにする。

pi@raspberrypi:~ $ which python
/usr/bin/python
pi@raspberrypi:~ $ ls -l /usr/bin/python*
lrwxrwxrwx 1 root root       7 Mar  4  2019 /usr/bin/python -> python2
lrwxrwxrwx 1 root root       9 Mar  4  2019 /usr/bin/python2 -> python2.7
-rwxr-xr-x 1 root root 2984816 Oct 10  2019 /usr/bin/python2.7
lrwxrwxrwx 1 root root      36 Oct 10  2019 /usr/bin/python2.7-config -> arm-linux-gnueabihf-python2.7-config
lrwxrwxrwx 1 root root      16 Mar  4  2019 /usr/bin/python2-config -> python2.7-config
-rwxr-xr-x 1 root root     154 Dec 30  2018 /usr/bin/python2-pbr
lrwxrwxrwx 1 root root       9 Mar 26  2019 /usr/bin/python3 -> python3.7
-rwxr-xr-x 2 root root 4275580 Jan 22  2021 /usr/bin/python3.7
lrwxrwxrwx 1 root root      36 Jan 22  2021 /usr/bin/python3.7-config -> arm-linux-gnueabihf-python3.7-config
-rwxr-xr-x 2 root root 4275580 Jan 22  2021 /usr/bin/python3.7m
lrwxrwxrwx 1 root root      37 Jan 22  2021 /usr/bin/python3.7m-config -> arm-linux-gnueabihf-python3.7m-config
lrwxrwxrwx 1 root root      16 Mar 26  2019 /usr/bin/python3-config -> python3.7-config
lrwxrwxrwx 1 root root      10 Mar 26  2019 /usr/bin/python3m -> python3.7m
lrwxrwxrwx 1 root root      17 Mar 26  2019 /usr/bin/python3m-config -> python3.7m-config
lrwxrwxrwx 1 root root      14 Mar  4  2019 /usr/bin/python-config -> python2-config
pi@raspberrypi:~ $

手順の流れ

  1. TeraTarmでsshログインする
  2. Pythonの実行媒体のダウンロード
  3. コンパイルとインストール
  4. シンボリックリンクの設定
  5. Pythonの反映確認

1. TeraTarmでsshログインする

WindowsにてTeraTarmを起動して、ラズパイにSSH接続する。

2. Pythonの実行媒体のダウンロード

取得可能なバージョンは、こちらのサイトから確認できる。

現在は、3.9.7が最新なのでこちらをwgetコマンドでラズパイにダウンロードする。

pi@raspberrypi:~ $ wget https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tgz
--2021-09-14 11:06:04--  https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tgz
Resolving www.python.org (www.python.org)... 2a04:4e42:1a::223, 151.101.108.223
Connecting to www.python.org (www.python.org)|2a04:4e42:1a::223|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 25755357 (25M) [application/octet-stream]
Saving to: ‘Python-3.9.7.tgz’

Python-3.9.7.tgz               100%[===================================================>]  24.56M  3.82MB/s    in 6.2s

ファイルが取得できたことを確認する。

pi@raspberrypi:~ $ ls -l Python-3.9.7.tgz
-rw-r--r-- 1 pi pi 25755357 Aug 30 20:52 Python-3.9.7.tgz
pi@raspberrypi:~ $

ファイルがダウンロードできた。

3. コンパイルとインストール

ダウンロードしたtgzファイルを展開し、コンパイルとインストールを行う。

pi@raspberrypi:~ $ tar -zxvf Python-3.9.7.tgz
pi@raspberrypi:~ $ cd Python-3.9.7/
pi@raspberrypi:~/Python-3.9.7 $ ./configure
pi@raspberrypi:~/Python-3.9.7 $ make

 
makeを実行したらエラーが二つ出た。

(エラー1)

/home/pi/Python-3.9.7/Modules/_ctypes/_ctypes.c:107:10: fatal error: ffi.h: No such file or directory
#include <ffi.h>
      ^~~~~~~
compilation terminated.

(エラー2)

Could not build the ssl module!
Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_host().
LibreSSL 2.6.4 and earlier do not provide the necessary APIs, https://github.com/libressl-portable/portable/issues/381

ffiとssl関連のパッケージに不足があるようだ。
次のコマンドで必要なパッケージを追加する。

pi@raspberrypi:~/Python-3.9.7 $ sudo apt install libffi-dev
pi@raspberrypi:~/Python-3.9.7 $ sudo apt install libssl-dev openssl

※Do you want to continue? [Y/n]が出た場合は、Yを入力する。

インストールしたSSLのパスをPythonに認識させるため、設定ファイルのパスを変更する。

pi@raspberrypi:~/Python-3.9.7 $ vi Modules/Setup

(変更前 ※変更箇所のみ抜粋)

#SSL=/usr/local/ssl
#_ssl _ssl.c \
#       -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
#       -L$(SSL)/lib -lssl -lcrypto

(変更後 ※変更箇所のみ抜粋。4行のコメントアウトを外し、SSLのパスを変更)

SSL=/usr
_ssl _ssl.c \
   -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
   -L$(SSL)/lib -lssl -lcrypto

もう一度configureとmakeしてみる。

pi@raspberrypi:~/Python-3.9.7 $ ./configure
pi@raspberrypi:~/Python-3.9.7 $ make

パッケージを追加することでmakeを実行してもエラーが起きなかった。

※余談※

pi@raspberrypi:~/Python-3.9.7 $ which openssl
/usr/bin/openssl

opensslのパスが/usr/bin/opensslだったので、最初にSSL=/usr/bin/opensslとしたが別のエラーとなってしまった。
パスを調べた結果SSL=/usrとするのが良さそうだったので、そうしてみた。

makeが完了したので、make install実行する。

pi@raspberrypi:~/Python-3.9.7 $ sudo make install

エラーが起きずインストールが完了した。
ログがかなり流れるが以下のメッセージを確認できた。
Python build finished successfully!

以下のコマンドでPython3.9.7がインストールされていることの確認。

pi@raspberrypi:~ $ ls -l /usr/local/bin/
total 16552
lrwxrwxrwx 1 root root        8 Sep 14 14:43 2to3 -> 2to3-3.9
-rwxr-xr-x 1 root root      101 Sep 14 14:43 2to3-3.9
lrwxrwxrwx 1 root root        7 Sep 14 14:43 idle3 -> idle3.9
-rwxr-xr-x 1 root root       99 Sep 14 14:43 idle3.9
-rwxr-xr-x 1 root root      229 Sep 14 14:45 pip3
-rwxr-xr-x 1 root root      229 Sep 14 14:45 pip3.9
lrwxrwxrwx 1 root root        8 Sep 14 14:43 pydoc3 -> pydoc3.9
-rwxr-xr-x 1 root root       84 Sep 14 14:43 pydoc3.9
lrwxrwxrwx 1 root root        9 Sep 14 14:43 python3 -> python3.9
-rwxr-xr-x 1 root root 16920720 Sep 14 14:40 python3.9           
-rwxr-xr-x 1 root root     3093 Sep 14 14:43 python3.9-config
lrwxrwxrwx 1 root root       16 Sep 14 14:43 python3-config -> python3.9-config
pi@raspberrypi:~ $

4. シンボリックリンクの設定

現在のpythonコマンドで呼び出されるバージョンを再確認する。

pi@raspberrypi:~ $ python --version
Python 2.7.16
pi@raspberrypi:~ $

まだ、Python 2.7.16のままで不便なので、シンボリックリンクを一度クリアしインストールしたバージョンに変更する。
インストールしたPythonのパスは/usr/local/binにあるため、ここにシンボリックリンクを張る。

pi@raspberrypi:~ $ cd /usr/bin/
pi@raspberrypi:/usr/bin $ ls -l /usr/bin/python
lrwxrwxrwx 1 root root 7 Mar  4  2019 /usr/bin/python -> python2

このシンボリックリンクを消す。

pi@raspberrypi:/usr/bin $ sudo unlink /usr/bin/python
pi@raspberrypi:/usr/bin $ ls -l /usr/bin/python
ls: cannot access '/usr/bin/python': No such file or directory

シンボリックリンクが消えたことを確認。

新しくインストールしたPythonにシンボリックリンクを張る。

pi@raspberrypi:/usr/bin $ sudo ln -s /usr/local/bin/python3.9 python
pi@raspberrypi:/usr/bin $ ls -l /usr/bin/python
lrwxrwxrwx 1 root root 24 Sep 14 14:54 /usr/bin/python -> /usr/local/bin/python3.9

5. Pythonの反映確認

python --versionコマンドにてpythonコマンドで呼び出されるpythonのバージョンを確認する。

pi@raspberrypi:/usr/bin $ python --version
Python 3.9.7
pi@raspberrypi:/usr/bin $

インストールが完了。

手順は以上。

参考文献

本記事の作成に当たり、以下の情報を参考にさせて頂きました。
- Raspberry PiでPythonをアップデートする方法
- Raspberry Pi に Python3.6をinstallしてみた