exe化したPyrhonプログラムが実行エラーになった場合の対処法|Pyinstaller FileNotFoundError
こんにちは。先日、Pythonプログラムをexeファイル化した時に、なかなかうまくいかず苦戦したので、エラーの内容と対処方法を記事に残しておきます。同様のエラーに遭遇された方の参考になれば幸いです。
exeファイルとは
拡張子が「.exe」になっている実行ファイルのことで、クリックするとプログラムが自動的に実行されます。Windows環境で動作します。
通常、Pythonのプログラムを実行するには、Pythonインストール済のPCを用意する必要があります。しかし、Pythonプログラムをexeファイル化することで、Pythonが未インストールのPCでも、プログラムを実行することが出来ます。
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ライブラリのファイルで同梱されないものは、たくさんあるようです…。
対処方法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時間以上かかりました。みなさんに同じ苦労を味わってほしくないため、この記事を書きました。少しでもお役に立てば嬉しいです。
最後まで読んでいただき、ありがとうございました。