Kevin's Data Analytics Blog

データサイエンティスト、AIエンジニアを目指す方に向けて情報発信していきます。

exe化したPyrhonプログラムが実行エラーになった場合の対処法|Pyinstaller FileNotFoundError

こんにちは。先日、Pythonプログラムをexeファイル化した時に、なかなかうまくいかず苦戦したので、エラーの内容と対処方法を記事に残しておきます。同様のエラーに遭遇された方の参考になれば幸いです。

exeファイルとは

拡張子が「.exe」になっている実行ファイルのことで、クリックするとプログラムが自動的に実行されます。Windows環境で動作します。

通常、Pythonのプログラムを実行するには、Pythonインストール済のPCを用意する必要があります。しかし、Pythonプログラムをexeファイル化することで、Pythonが未インストールのPCでも、プログラムを実行することが出来ます。

f:id:dskevin:20210214172036p:plain:h80
Pythonのexeファイルのアイコン

Pythonプログラムをexeファイル化する方法

Pythonプログラムのexeファイルを作成するには、Pyinstallerというライブラリを使用します。最初に、コマンドプロンプトを開いて、以下のコマンドを実行して、Pyinstallerをインストールします。

pip install pyinstaller

次に、exe化したいPythonのプログラムファイル(.py)が存在するフォルダに移動します。

cd 作業フォルダのパス

その後、以下のコマンドを実行します。

pyinstaller プログラムファイル名 -–onefile

「--onefile」というオプションを指定することで、実行ファイルを1つのexeファイルにまとめてくれます。実行後、以下の様なメッセージが表示されれば、exeファイルの作成は完了です。

INFO: Building EXE from EXE-00.toc completed successfully.

遭遇したエラー

出来上がったexeファイルを実行したところ、次のようなエラーが表示されました。

FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\userpc\\AppData\\Local\\Temp\\_MEI105442\\wordcloud\\stopwords'

wordcloudライブラリで使用しているstopwordsというファイルが見つからないようです。「--onefile」というオプションを指定しているので、基本的には関連ファイルを含めて1つのexeファイルにまとめてくれるはずですが、漏れてしまったようです。

対処方法(同梱ファイルの追加)

stopwordsは、wordcloudライブラリのインストールフォルダにあります。
「--add-data」オプションを付けて、以下のように実行する必要がありました。

pyinstaller プログラムファイル名  --onefile --add-data wordcloudのインストールフォルダ\stopwords;wordcloud

※wordcloudのインストールフォルダ例:
 C:\Users\コンピュータ名\anaconda3\Lib\site-packages\wordcloud\

「--add-data」オプションは、exeファイルに同梱するデータを追加で指定することができ、次のように使用します。

--add-data 元データのパス;取り込み先のパス

今回の場合、元データのパスはファイルのパスをそのまま記入し、取り込み先のパスにはwordcloudとしました。エラーメッセージをみて、stopwordsファイルはwordcloudというフォルダの配下に展開されていることを参考にしました。

遭遇したエラー2

作り直したexeファイルを実行したところ、先ほどのエラーは回避できたのですが、別のエラーが表示されました。

FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\userpc\\AppData\\Local\\Temp\\_MEI75162\\janome\\sysdic\\entries_compact0.py'

今度は、janomeライブラリで使用しているファイルが見つからないようです。こちらも、先ほどと同様に、entries_compact0.pyを「--add-data」で追加して再度実行してみました。

ModuleNotFoundError: No module named 'janome.sysdic.entries_compact0_idx'

janomeライブラリのファイルで同梱されないものは、たくさんあるようです…。

f:id:dskevin:20210301200506p:plain:h320
janomeライブラリのsysdicフォルダ

対処方法2(同梱フォルダの追加)

wordcloudのstopwordsファイルに加えて、janomeのsysdicをフォルダごと「--add-data」オプションに指定します。

pyinstaller プログラムファイル名  --onefile --add-data wordcloudのインストールフォルダ\stopwords;wordcloud --add-data janomeのインストールフォルダ\sysdic;janome\sysdic

janomeのインストールフォルダ例:
 C:\Users\コンピュータ名\anaconda3\Lib\site-packages\janome\

これでexeファイルが無事に実行できました。

まとめ

今回、wordcloudとjanomeを使う場合以外にも、PyinstallerでNotFoundErrorが出たら、必要なファイルの同梱が漏れている可能性があります。その場合、「--add-data」オプションで、自分で必要なファイルまたは、フォルダを追加してみましょう。将来的には、Pyinstallerの仕様が改善されて「--onfile」オプションで対応できるようになってほしいです。
今回、最初のエラーが出てから、最終的に解決するまでにトータルで3時間以上かかりました。みなさんに同じ苦労を味わってほしくないため、この記事を書きました。少しでもお役に立てば嬉しいです。

最後まで読んでいただき、ありがとうございました。