注目の投稿

作ったもの

長らく更新していませんが、生きてます。   仕事上で作成したものの仮置き場。  ・ Thyroid_datasheet   とある研修用に作った入力用webアプリ。 データを入れると日付毎に簡単な解析をかける。アップデート予定 。 言語はpython。デプロイの楽さからstreamlitベースで作成。

pyinstallerで作成したmatplotlibを含むexeがRuntimeErrorで実行できない問題


私は自分用に使うデータ処理などはCかC++などを使用して行うことが多いのですが、最近やってきた上長がそれを配布する(開発環境のない人でも使えるように)ことをご所望。
まあ、それはいいのですが(よくねえよめんどくせえな)、本人の知人にpythonを主に使う人がいるらしく、手元のソフトに合わせてpythonで書いたものがいいなとのこと。
(本人ならまだしも知人がpythonだからpythonに統一したいとか、こいつさては素人か?) 

言語とかどれでも同じやろと若干切れながらC++で書いたものをpythonに移し替え、配布用のexeを作成したところで躓きました。
.pyファイルをpyinstallerでexe化し、実行したところで遭遇したエラーの対処法を備忘録として残します。

私の開発環境は以下の通りです。
 
Python 3.9.6
matplotlib 3.3.2
PIL 8.0.1
pyinstaller 3.6

で、今回exe実行時に遭遇したエラーというのは、以下のRuntimeErrorです。

MatplotlibDeprecationWarning: Matplotlib installs where the data is not in the mpl-data subdirectory of the package are deprecated since 3.2 and support for them will be removed two minor releases later.

(中略)

RuntimeError: Could not find the matplotlib data files 
 
このエラーについて検索をかけると、いくつか解決策を提示しているページが見つかりました。


これらの内容をまあざっくりまとめると
 
・matplotlibのパスが通ってないからパスを通せ
・matplotlibのバージョンを3.2.2以前に戻せ
 
という内容です。
それらの具体的な方法については各ページを参照していただくとして、私がこの記事をわざわざ書いているのはなぜかと言えば、これらで問題を解決できなかったからですね。
前者に関しては基本的なことなので省略します。
後者についてはおそらく問題を解決してくれるのですが、開発に用いている他のパッケージの兼ね合いで私の場合はmatplotlibをダウングレードすることができませんでした。

さらに時間をかけて調べた結果解決に至る記事が以下のページに見つかりました。


「ネットに解決策落ちてるなら記事書く必要ないじゃん」という気もしますが、記事が埋もれていて発見に時間がかかり、日本語の解説も存在しなかったため、今回の記事執筆に至っています。

結局のところ何が問題だったかというと、pyinstallerがmatplotlibを呼び出すときの構文に誤りがあったようです。
(正確にはmatplotlibの仕様変更でこれまでの構文では動かなくなっていた。)
なので、これを正しく書き換えてやれば問題なく動くようになります。
具体的には、 .../PyInstaller/hooks/hook-matplotlib.pyを編集することになります。
PyInstallerフォルダの所在は環境に依存するので、パッケージのインストールフォルダ内を検索すると良いかと思います。
hook-matplotlib.pyを開いて、
 
datas = [
    (mpl_data_dir, "matplotlib/mpl-data"),
]

となっている場所を
 
datas = [
    (mpl_data_dir, "mpl-data"),
]
 
のように編集してください。
この状態で再度pyinstallerでexeを作成すれば問題なくexeを実行することができるようになりました。
(それ以外の問題がなければ)

ただ、作成したexeの容量が予想をはるかに上回って大きかったので、そちらへの対処にまた時間がかかってしまいました。
それについては日本語の解説ページがたくさんあるようなので、そちらを参照いただくことにして、今回の記事は終わりたいと思います。

コメント