Pythonを勉強してみようと思った延長で、せっかくだから何か形にしてみようと思い、ネットを漁りましたらkivyというものに辿り着きました。kivyはPythonライブラリの一つで、importすることでAndroid上でも動作可能なアプリを開発できるらしい。
Chromebook環境に導入した記事が見当たらなかったのですが、導入事例をブログに載せておられる方々も少なからずおられるようだったので、ちょっと頑張ったら導入できるだろう、と軽い気持ちで始めたところ、泥沼のようにハマってしまい、抜け出すまでにかなりの時間を要しました。同じ過ちを何回もやってしまう質なので、忘れないように記事にしました。いつか、何かの役に立てばと。
失敗その1 「簡単そう」な方法を試してみた
この時点の失敗は失敗ですが、その後に支障をきたすようなことはない他愛の無いレベルです。まずはじめに試したのは以下
pip3 install -U pip #pipのバージョンアップ。これは成功。21.1.3になりました。
pip install kivy #エラー。インストール失敗
割と多くのブログではこの2ステップで完了してるように書かれてました。
難しそうな記事は読みたくなかったし(いや、読めよ、ってとこですが)
手短に済むならハッピー。しかしうまく行かなかった。
失敗その2 「kivy インストールできない」で検索し、手当り次第実行
検索すると、まあまあな数の日本語記事が出てきました。
それを「片っ端から試して見よう」とやってみました
python -m pip install --upgrade pip wheel setuptools
#wheelのバージョンが0.36.2になりました。しかしkivyのインストールには失敗
pip install cython
#バージョン0.29.23のcythonをインストール。しかし、依然としてkivyインストールはエラー。
失敗その3 sudoで強制的にpipのバージョンを落とした。
これのせいで、このあとピンチが訪れます。
「インストールがうまく行かない」で検索してますと、「pipのバージョンを落とすと、うまくいく」的な記事をいくつか見つけました。じゃあ試そうか
pip -m pip install --force-reinstall pip==18.1
バージョン18.1を指定したのは、その「バージョンより上だと相性が悪い」的な記事を見つけたためです。
コマンドを実行すると「管理権限が無い」的なエラーメッセージが出たため、次を実行
sudo pip -m pip install --force-reinstall pip==18.1
問題なく通り、pipのバージョンは18.1になりました。
さて、これでインストールを試みようとしましたところ、
「管理権限が無い」的なエラーメッセージが....?
今まで出なかったのに....?嫌な予感がする....。
とりあえず従ってみよう。
sudo /user/bin/python3 -m pip install kivy
すると、インストールには失敗しましたが、その過程でkivy-gardenというものがインストールされました。
「失敗したが、ちょっと前進したか?」
「というか、kivy-garden以外にも依存関係の観点でインストールしておくべき何かがあるのでは?」
そう思い、そのような検索をすると、確かにpygameやcython等は必要だよ!的な記事が多数。そうか、片っ端から入れてやろうじゃないか!しかしこのあと、先程一瞬不安に思った件が深刻な事態に発展していたことに気が付きます。
pip installが全く受け付けられなくなりました。
細かく言うと、
・sudoを付けないとinstallコマンドは実行されない
・sudoをつけるとpipのバージョンがよくない的な感じでエラーになる
・pipのバージョンを元に戻すコマンドも一切受け付けられない
....ヤバい。詰んだか?google先制、これ、どうしたらええの?
ってかこんな記事があるんですけど!
https://endy-tech.hatenablog.jp/entry/never_execute_sudo_pip
※以下、引用させていただきます
sudo pip installは実行しないでください。
Fedora Wikiでも、以下のように力強く書かれていました。
(中略)
実行してはいけない理由は2つあります。
・システムを破壊する懸念がある
・知らぬ間にvenvの外側を破壊するケースがある
いや、実行してしまったんですけど!?
万が一、使ってしまった場合は…書いてない。
どないしよう、Pythonってアンイストールできるんやろか?と調べると、
どうやらディストリビューションであるDebianパッケージ自体がpythonに
依存しているので不可。
ってことは....Linuxを入れ直すしか無いのか?
マジか!?
いやいや、なにか手段があるんじゃないか?
日本語サイトしか見てないけど、英語サイトまで検索したらあるいは...?
そして辿り着いたのは...公式ホームページ。
英語は苦手ですが、et-pip.py なるものをダウンロードして実行すればいい
的なことが書いてある。対象のファイルをダウンロードし、以下を実行。
python get-pip.py
すると...なんと!復活!!
pipは最新版となり、pip installコマンドもsudo無しで普通に通る。
思わずガッツポーズしてしまいました。
改めて、インストールできない原因を考えてみる
sudo pipの後遺症がどこかに残っているかもしれませんが、分かる範囲では元の状態に戻った感じです。もちろん、依然としてkivyのインストールは失敗します。
なぜか。
そもそも、何がエラーになっているのか?
最初からそれ見ろよ。これが今回の教訓です。
この時点で初めて、どんなエラーメッセージが出ているのか?を確認しました
すると、以下のメッセージが連発されていることに気が付きます。(本当はもっと長いメッセージですが、大部分省略して掲載します)
#include <GL/gl.h>
compilation terminated.
building 'kivy.graphics.compiler' extension
In file included from kivy/graphics/compiler.c:611:
kivy/include/gl_redirect.h:72:13: fatal error: GL/gl.h: そのようなファイルやディレクトリはありません
ERROR: Failed building wheel for kivy
Failed to build kivy
ERROR: Could not build wheels for kivy which use PEP 517 and cannot be installed directly
なんとなく、なんかのコンパイルに失敗している?PEP517って更によくわからんのが出てる。PEP517を検索してもよくわからなかったが、別のPythonライブラリをインストールしようとして同じエラーメッセージが出ている方が、「libgl1-mesa-dev」を導入しました的な記事を書かれておられるのを発見。何やねん、libgl1-mesa-devって?しかし、kivyの公式ページを注意深く眺めると、依存するもの、の中にある...。そうか、必要なモンなんだな?
sudo apt-get install libgl1-mesa-dev
すると...、何と、kivyインストールに成功!!
長かった...。
「記念に、一回動かしてみるか」
とサンプルプログラムを実行してみると....
「エラー、pygameがありません」
ぬか喜びかよ...。ちなみにpipでインストールは...エラー。だよね...。
しかし、このパターン。コツを掴んだ。
きっと、依存しているものが、何か足りないんだ。
このあと紆余曲折ありましたが以下を実行
sudo apt-get install libsdl-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev
sudo apt-get install libsmpeg-dev libportmidi-dev libavformat-dev libswscale-dev
sudo apt-get install python3-pygame
結果はご覧の通り
結局、どうすれば良かったのか
長々と書いてしまいましたが、もしこれからトライされる方、あるいはもう一回やり直すかも知れない自分に対してお伝えしたいことは以下のとおりです。
・まずは「公式」の手順に従うこと
・インストールの必要要件、依存関係は確認しておくこと
・エラーとなる場合、どのへんで引っかかっているのか、チェックする
(場当たり的に方法を変えても時間を浪費するだけ)
・結局必要だったと推定されるのは
-Pythonライブラリ:cython、pygame
-その他ライブラリ:libgl1-mesa-dev, libsdl-dev, libsdl-image1.2-dev, libsdl-mixer1.2-dev, libsdl-ttf2.0-dev, libsmpeg-dev, libportmidi-dev, libavformat-dev, libswscale-dev
※何しろ手当り次第コマンドを打ち込んだので、上記以外にも知らないうちにインストールされたものもあるかも知れず、上記ですべてかどうか自信がありません。