PyInstallerでEXE化する際によくわからないエラーでつまってませんか?
PythonスクリプトをPyInstallerでEXE化する際、スクリプトが依存するデータを適切に含めれていないからかもしれません。
PyInstallerには依存するデータを適切に含めるための2つの主要オプション、--collect-dataと--add-dataがあります。
しかし、それぞれの違いや使用方法がわからず混乱することもあるでしょう。
この記事では、両者の違いを具体例とともに詳しく解説します。
--collect-dataとは?
--collect-dataは、特定のモジュールが依存するデータファイル(例:スタイルシート、フォント、設定ファイルなど)を自動的に収集してEXEに含めるためのオプションです。PyInstallerが依存関係を解析する際に収集対象から漏れるデータを補うのに便利です。
主な用途
- モジュールに関連付けられたデータファイルを自動収集
- モジュールの動作に必要なスタイルファイルや設定データを漏れなく含める
使用例
Matplotlibを使ったスクリプトをEXE化する場合:
このコマンドは、Matplotlibが必要とするフォントやスタイルファイルを自動収集し、EXEに含めます。
--add-dataとは?
--add-dataは、特定のリソースファイル(画像、設定ファイルなど)を手動で指定し、EXEに含めるためのオプションです。このオプションはスクリプトが利用するカスタムリソースを含める際に使います。
主な用途
- 独自のリソースファイル(画像、CSV、設定ファイルなど)を含める
- 自動収集されないモジュール外のファイルを追加
使用例
スクリプトが独自の設定ファイルを参照する場合:
このコマンドは、settings.jsonをconfig/フォルダに格納する形でEXEに含めます。
--collect-dataと--add-dataの違い
| 項目 | –collect-data | –add-data |
|---|---|---|
| 対象 | モジュールに関連付けられたデータファイル | 独自に指定したリソースファイル |
| データ収集の方法 | 自動収集 | 手動指定 |
| 主な用途 | モジュール依存のスタイルや設定ファイル | 画像や独自の設定ファイル |
| 指定方法 | モジュール名 | “ファイルパス;配置先フォルダ” |
| 収集範囲 | モジュール全体に関連するデータ | 特定のファイルのみ |
使用シナリオでの選択
--collect-dataを使うべき場合
- Matplotlib、Pandas、SciPyなど依存データが多いモジュールを使用しているとき
- モジュールがデフォルトで使用するスタイルファイルやフォントが必要なとき
--add-dataを使うべき場合
- スクリプトが独自に読み込む画像や設定ファイルがあるとき
- PyInstallerがモジュールの依存関係を認識できず、データが不足するとき
実用例
Matplotlibを使ったグラフ描画アプリ
以下のスクリプトをEXE化する例を考えます:
このスクリプトをEXE化する場合、スタイルファイルやフォントが不足するとエラーになります。以下のようにコマンドを実行して解決します:
独自設定ファイルを持つデータ分析アプリ
以下のスクリプトを例に考えます:
このスクリプトをEXE化する際、settings.jsonをEXEに含めるには以下のコマンドを使用します:
スクリプト内でファイルを参照する際は、以下のようにパスを解決する関数を使用する必要があります
--collect-dataと--add-dataの併用
場合によっては両方を同時に使うこともあります。たとえば、Matplotlibを使用しつつ独自の設定ファイルを持つアプリの場合
よくあるエラーと解決策
エラー例 1: リソースファイルが見つからない
FileNotFoundError: [Errno 2] No such file or directory: 'config/settings.json'
解決策:
--add-dataでリソースを明示的に含める:
エラー例 2: データ不足によるモジュールエラー
ModuleNotFoundErrorやデフォルトスタイルの読み込みエラー
解決策:
--collect-dataで必要なデータを収集:
まとめ
PyInstallerでEXE化する際、--collect-dataと--add-dataは重要なオプションです。
それぞれの用途を正しく理解し、必要に応じて使い分けることで、依存データやリソースを含む実行可能ファイルを問題なく作成できます。
本記事を参考に、どちらのオプションが適しているか判断して作業を進めてみてください!




コメント