Android黎明期のクラムシェルたち ( その3 LifeTouch NoteでPython最新版を使おう )
LifeTouch Noteで、Python3.8.6をコンパイルしてみる
前回で、一通りの環境を構築できたのですが、実はPython環境に問題があります。
”pip”が動きません。
このバージョンでは、”pip”はpython標準インストールでは入らないので、”apt-get install python3-pip”で入れてみたのですが、モジュールをインストールしようとすると、”Cannnot fetch index base URL http://…. ”とエラーを吐き、動いてくれません。
どうも、セキュリティ関係の問題のようなので、色々情報を探ったり、confファイルを書いたり、設定を変えてみたりしたのですが、うまくいかず匙を投げました。
そもそも、Python3自体もバージョンが”3.2”と低いこともあって、今一つの感があります。
ということなので、Pythonをソースからコンパイルして、最新のレベルまで挙げてしまいしょう。Python3.7以降は、”pip”も標準装備なので、これで悩むこともなくなるとの期待も込めています。
Pythonのコンパイル方法
Pythonのコンパイル方法は、インターネット上にいくつかの情報が上がっていますが、今回は
このサイトの情報を参考にさせていただきました。ありがとうございます。
やるべきことは簡単で、下記のステップを取ります。
(1)必要なパッケージの事前インストール
まずは、前回インストールしたPython3を削除しておきます。
# apt-get remove python3 python3-pip
# apt-get autoremove
その後、必要なツールをインストールします。開発ツールである”build-essential”は、当然入っていると思いますが、記録のため入れておきます。
# apt-get install build-essential libbz2-dev libdb-dev libreadline-dev libffi-dev libgdbm-dev liblzma-dev libncursesw5-dev libsqlite3-dev libssl-dev zlib1g-dev uuid-dev tk-dev
(2)Pythonソースのダウンロード
本家python.orgから、ソースをダウンロードします。今回は、”Python-3.8.6.tgz”を使いました。
(注)2020/10にPython3.9.0が出てしまい、3.8.6は最新版ではなくなってしまいました。「タイトルに偽りあり」ですが、新バージョンの最初のリリースはいささか不安。こちらを使うことにしました...ということにしておいて下さい(笑)。
(3)Pythonのコンパイルとインストール
適当なディレクトリに置いたtar ballを解凍し、下記の手順でコンパイルとインストールを実行します。
# tar xzvf Python-3.8.6.tgz
# cd Python-3.8.6
# ./configure
# make
# make altinstall
LifeTouch Note実機で実行すると、1時間程度かかりますが、特に問題なく完了しました。
老体に鞭打って、PythonをコンパイルするLifeTouch Noteの勇姿を見よ!!
ここまでは、順調でしたね。
SSLの問題が発生
上記作業が完了すると、”/usr/local/bin/python3.8”、”/usr/local/bin/pip3.8”の実行ファイルがインストールされています。
早速、使ってみましょう。
Pythonインタープリタは問題なく動きましたが、”pip”はこれまたエラーを吐いています。どうもSSL関係のようですが、コンパイル前に”libssl-dev”はインストールされていることを確認しています。
確認のため、”ssl”をimportしようとすると、
なるほど、インストールされていませんね。
これには相当悩みましたが、こんな情報を見つけました。
このサイトによると、
The first problem is that the packaged versions of openssl and libssl-dev are missing header information required to build Python 3.7+ so you will have to compile your own:
とのこと。要するに、「packageで入れたopensslとlibssl-devには、Pythonをbuildするために必要なheaderがない」らしい。
対応策としては、「opensslをソースからコンパイルして、生成されるヘッダーとライブラリを使え」ということのようです。
問題解消へのアプローチ
それでは、上記情報に従って、対応していきましょう。
(1) opnesslのコンパイル
まずは、必要なツールを事前に入れて置きます。
# apt-get install checkinstall libreadline-gplv2-dev libncursesw5-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev
opensslのソースをwww.openssl.orgからダウンロードして、”/usr/src”に配置します。
このサイトと同じバージョン”openssl-1.0.2o.tar.gz”を使うことにしました。
# cd /usr/src
# tar xzvf openssl-1.0.2o.tar.gz
# cd openssl-1.0.2o
# ./config shared --prefix=/usr/local/
# make
# make install
完了後、Python用に”lib”ディレクトリを作成し、上記で生成されたobjectをコピーしておきます。
We will need to pass /usr/src/openssl-1.0.2o into the Python configure script. However, the configure script will look for a lib directory in that path which doesn’t exist. So we’ll create that manually:
ということですね。
# mkdir lib
# cp ./*.{so,so.1.0.0,a,pc} ./lib
(2) Python3.8.6のリコンパイル
次に、Pythonを再度コンパイルします。
# cd Python-3.8.6
# ./configure --with-openssl=/usr/src/openssl-1.0.2o
# make
# make altinstall
今回は、”configure”で、先程生成した”openssl”のディレクトリを指定しておきます。このサイトでは、”–enable-optimizations”も指定していますが、処理時間が大幅に伸びますので、ここでは外しておきます。
完了後、早速テストしてみます。
あれれ、うまくいかない。これはまいったなあ。
再度、makeをかけてみると、SSL関係やはりおかしかったようです。大量のメッセージがターミナル上に流れていたので、見逃していました。
(3) 解決策
メッセージを見る限り、opensslライブラリ関係のように思われます。
このサイトのComments欄にも「うまく行かなかった」という報告があり、そのフォローとして、下記の環境変数を指定してからコンパイルせよ、というコメントがありました。
なるほど、今回インストールしたオブジェクトとヘッダーを先に参照させろということですね。
早速、これを指定して再コンパイル。”clean”したほうが良いでしょう。
# export LDFLAGS="-L/usr/local/lib/"
# export LD_LIBRARY_PATH="/usr/local/lib/"
# export CPPFLAGS="-I/usr/local/include -I/usr/local/include/openssl"
# make clean
# make
うまくいったようなので、再度インストール。
# make altinstall
検証してみましょう。
”ssl”のimportも、pipによるモジュールインストールもうまくいきました。
なお、再ログイン後の実行にも有効になるよう、~/.bashrcに下記を追加しておきましょう。
export LD_LIBRARY_PATH="/usr/local/lib/"
これで、Python3.8.6のインストール完了です。”pip”も動いてめでたし、めでたし。
「これ、何に使うの?」と聞かれると、少しうろたえますけど(笑)。
まあ、自己満足でいいじゃありませんか。
今回は少し無理をしてPython3を使えるようにしてみましたが、この後pandasのインストールには失敗しました。この時代では、いまだPython3環境が整備されていないということでしょう。
Python2.7が標準で入っていることを考えると、こちらを使ったほうが現実的ですね。pandasも”apt-get install python-pandas”で簡単にインストールできます。