pythonでQRコードを読み取ってごにょにょするアプリの開発をした時に
ライブラリが見つけられないエラーが出て困ったので共有します。
zbarを見つける必要がないエンジニアは今すぐ立ち去った方がいいです。
QRコードを読み取ってくれるライブラリ pyzbar
pythonでQRコードを読み取るライブラリにpyzbarといったライブラリがあります。
こちらをインストールさせQRコードを読み取ろうとすると。以下のようなエラーが出てくる
ImportError: Unable to find zbar shared library
「へい!そこのお前!zbarが見つけられないぜ!」
調べてみるとpyzbarはZbarがないと機能してくれないらしい。
ふーん、おもしれーライブラリ
調べてみた
pyzbarのドキュメントを見るとzbarはhomebrew経由でインストールさせろって
普通に書いてありました。
話はそれるんですけど男の子って説明書読まずに玩具とかゲームとかしますよね。
なんなんすかねあれ。
言われた通りhomebrewでzbarをインストール
brew install zbar
よっしこれでQRコード読めるぞ!ぐへへへ!
...と思っていた時期が僕にもありました
ImportError: Unable to find zbar shared library
問題点
結果的に言うとhomebrew君はApple Silicon版Macだとライブラリを保存させる場所がちょっと変わってるようです。
Apple Silicon君はいつも問題を起こすんです。
解決策
このissueで解決です。
https://github.com/NaturalHistoryMuseum/pyzbar/issues/37
$ mkdir ~/lib
$ ln -s $(brew --prefix zbar)/lib/libzbar.dylib ~/lib/libzbar.dylib
やってることは簡単です。
homebrew君がインストールしてくれたライブラリをzbarが参照できるように橋渡ししてくれるシンボリックリンクってやつを作ります。
このシンボリックリンクって奴が上手いこと参照先を変えてくれてzbarを見つけてくれるんですね。
再び襲いくる悪夢
無事にQRコードを読み取ることができました。これで世界は平和になったと安堵したいところでしたが、次の問題がおこりました。
pythonファイルを他のPCとかでも動かせるようにpyinstallerで実行ファイル化し、それを他のPCで動作できるか確認をしたところ....
ImportError: Unable to find zbar shared library
ここまでくると実家に帰ったかのような安心感があります(?)
問題点と解決方法
もちろん渡した先でhomebrew経由でzbarをインストールすれば解決なのですが、今回想定しているユーザーは非エンジニアの方であり
homebrewをインストールして、そこからさらにzbarをインストールさせるにはちょっと難易度たかいんですよね。
(余談ですが同じプロジェクトメンバーがインテル版からApple Silicon版に移行システムを使ったmacでhomebrewを使うとアーキテクチャがintel版のままだったので環境構築に時間がかかってたのでhomebrewでインストールは避けたかった)
今回はzbarは事前にこちらが用意した物を使ってpyzbarが読み取れるように修正してあげる方針でいきました。
ゴッド・シンボリックリンク
最初はpyzbarの参照先を変えられないか試行錯誤したんですが、何か無理そう(知ってる人いたら教えて欲しい)
そこでpyzbarの参照先自体は変えずに、シンボリックリンクを使って、事前に用意した
zbarライブラリに橋渡ししてあげればいいじゃん!と思った次第です。
そこで問題になるのがzbarライブラリをどこに保管するか?ですが
今回実行ファイル化したpythonアプリはelectronを使ってデスクトップアプリとして
使用する想定だったので、zbarライブラリはmacの
Application Support/{applicationName}
の中に保管しました
そして上記保管先を参照するようなシンボリックリンクを以下コマンドで作成します
USERNAME=$(whoami)
mkdir -p ~/lib
ln -sf "/Users/$USERNAME/Library/Application Support/applicationName/libzbar.dylib" ~/lib/libzbar.dylib
「I'll find you」
これで無事にpyzbarがzbarを見つけてくれました。
本当はpyzbarの参照先を動的に変更したかったんですけどね....
まとめ
今回初めてpythonとelectronを使ってデスクトップアプリを開発しましたが
Webアプリの知識でスラスラコード書けたので開発しやすかったです。
あと
シンボリックリンクは神