piwheelsにバイナリがない時どうすれば良いか、あるいは、いかにpiwheelsが重要かという話


pandasの最新版、0.25.0のバイナリが無かった

昨日、ラズパイで、ふと、pandasやってみようと思いたち、インストールを試みました。

ところが、最新版のバイナリを取得できず、ソースのダウンロード、ビルドを初めてしまう。しかも、時間がかかったあとに、エラーが出まくって失敗。ツールがないとか、古いとか、あーでもないこーでもない、と、何度も失敗、かなり膨大な時間をかけて、成功。正常なビルド自体も75分かかり、割と大きいパケージですね。

pip自体のオプションや新しいツールについても学んだので、無駄ではなかったものの、かなり、根性がいりました。ビルドに必要な依存関係は、実行時の依存関係と比較して、あまり明確になっていないようですね。まぁ、そりゃそうか。

困るなと思いつつ75分もかけて手元でビルド。しかも、何台も。バイナリでの移動がよくわからなかったのと、ビルド環境ごと更新しておかないと、あとでより一層、面倒になりそうだったので。あと、75分放置するだけなので。

なんで、バイナリがないの? あるやつはどこにあるのか

pythonのパッケージ/モジュールはPyPi (Python Package Index)にソースがあります。主要パッケージ、主要プラットホーム、主要Pythonバージョン用にはビルド済バイナリもあります。
で、ラズパイは「主要」じゃなくいのでバイナリが無い。

それならば、自分たちでラズパイ用バイナリをビルドして、自前のwheelも作って公開しちゃえ。が、piwheelsです。主要なパッケージについてバイナリがあります。

piwheelsすごい!

普段は、ダウンロードもビルドもそんなに時間がかからないので、どこからソースが来るのか、バイナリが来るのか、気にも留めてなかった。

wheelの存在、piwheelsができた経緯について、詳しくなりました。piwheelsの作者、Ben Nuttallは以前から知っていましたし、piwheels誕生についてニュースブログtwitterも読んでいましたが、その時にはピンと来てなかった。

piwheelsすごい!

今回のように自前でビルドするときに75分は厳しい。しかも、ビルドツールが整備されていないと無理、死ぬ。というわけで、piwheelsさまさまです。

なんで、piwheelsに無いのか?

で、なんでpiwheelsに無かったのと思ってpiwheels packagesのissueを確認したら、ビルドに失敗していたことがわかり、さらにビルド時には、当時最新のnumpy-1.17.0rc2を使っていたことがわかりました。
https://github.com/piwheels/packages/issues/46

手元でのビルド時にも古いバージョンではエラーが出て、numpy-1.17.0を入れたら成功したので、その点を伝えたらBenがすぐにリトライしてくれてビルド成功!

numpyのリリース候補版、正式リリース版の間にpandasがリリースされていたんですね。RC版はリリース版とほぼ変わらないはずですが、見せてもらったエラーログを眺めた分には濃厚。

そもそも、RC版を使ってビルドするのはどうなんだろう??

バイナリがなかったら、まずpiwheels packagesのissueを確認!

piwheelsに最新バイナリがないときは、issueを上げたら解決につながる場合もあることを学びました。大勢のラズパイユーザーも助かる。

ちなみに、Benはラズパイ財団コミュティマネージャーです。Raspberry JAMなどで関わりがあります。PiWheelsだけでなくGPIO Zeroも彼がリードしています。https://bennuttall.com Ben Nuttallさまさま。

opencv関係も自動ではうまくいかなくて彼ら自身が手動でやっているものもあるようです。

おい! pandas-0.25.1がでてるやん!

で、昨日の今日、pandas-0.25.1が出てました。piwheelsにも既に上がっていて、問題なく自動ビルドできた模様。良かった。
https://www.piwheels.org/project/pandas/

Successfully installed pandas-0.25.1
real    1m24.284s
user    0m35.791s
sys 0m2.729s

python3 REPLにて
>>> import pandas
>>> pandas.__version__
'0.25.1'

というか、思い立ったのが一日遅かったら、何も気が付かないまま2分でインストール成功していたはず。そして、今回のことはなかった。運命か。

ということでエントリーを書きました。

piwheelsに感謝しよう!
そろそろ2周年なので、Benにも感謝を伝えよう!

おまけ

今回、新しく知ったツール、pipdeptree。
pipでインストールしたパッケージのdependency tree、依存関係を教えてくれます。

sudo pip3 install pipdeptree

pipdeptree -p pandas

pandas==0.25.1
  - numpy [required: >=1.13.3, installed: 1.17.0]
  - python-dateutil [required: >=2.6.1, installed: 2.8.0]
    - six [required: >=1.5, installed: 1.12.0]
  - pytz [required: >=2017.2, installed: 2019.2]