ラズパイへの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の実行媒体のダウンロード

取得可能なバージョンは、こちらの[サイト](https://www.python.org/ftp/python/)から確認できる。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/c508be74-045d-bda2-4d7f-187583234e0d.png)


現在は、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を実行したらエラーが二つ出た。

(エラー１)

	/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.
	
(エラー２)

	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をアップデートする方法](https://intellectual-curiosity.tokyo/2019/12/07/raspberry-pi%E3%81%A7python%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)
- [Raspberry Pi に Python3.6をinstallしてみた](https://qiita.com/satsukiya/items/581ffdc6f4dcef650835)