📚

librosa を pyinstaller でパッケージするメモ

2023/04/10に公開

https://github.com/librosa/librosa/issues/1682

最近の librosa だと lazy_loader 使っていてめんどいです.
lazy_loader 使うほどのライブラリではないと思うのに...

init.py

pyinstaller でパッケージすると, (内部での)拡張子は pyc になります.
したがって __init__.pyc を読もうとしてエラーになります.
(エラーにならない場合もあるが, その場合 module 関数がうまく import されてないため, たとえば librosa.filters.mel など呼び出そうとすると実行時エラーになる)

https://github.com/librosa/librosa/issues/1682

現状はこのように librosa/__init__.py を書き換えることになるでしょう
(pyinstaller でなにか頑張ってこねくり回すのもできるかとは思うが調べるのがめんどい)

hiddenimports

librosa, librosa.filters など, app で利用する module(の階層)は hiddenimports に追記しておきます.

init.pyi とか

.spec で collect_data_files("librosa") or 引数 --collect_data=librosa して, __init__.pyi などのファイルを含めるようにします
(lazy_loader が利用しているっぽい)

参考例

https://github.com/syoyo/espnet-tts-streamlit

の .spec あたりを参照ください.

Discussion