PyinstallerでPygameスクリプトをexe化する際に発生した、以下のエラーに対処するためのチェックポイントを書き残します。
Failed to execute script XX
はじめに
こんにちは、@bioerrorlogです。
以前、Pygameで作ったゲームのスクリプトをPyinstallerを用いてexe化し、itch.ioで配布してみました。
その際、何度か悩まされたエラーがこちらです。
Failed to execute script XX
今回は、このエラーが発生する状況とその対処方法を書き残します。
環境
Windows10
各バージョン情報
Python 3.7.6 pygame 2.0.1 pyinstaller 4.2
“Failed to execute script XX” エラーの対処法
私がエラーに遭遇した状況からまとめると、以下の3つの注意点があります。
- Pygameスクリプト内のimportパッケージはインストールされているか
- ゲームアセットの依存関係は保たれているか
- Pygame終了時にsys.exit()しているか
以下、ひとつずつ説明します。
Pygameスクリプト内のimportパッケージはインストールされているか
まず一つ目、Pygameをexe化する際には、そのスクリプト内でimportされているパッケージがインストールされている必要があります。
例えばGitHubからコードをcloneし、そのままPyinstallerによるexe化を行った場合、ゲームの実行に必要なパッケージがインストールされていないままの可能性があります(私がそうでした)。
必要なパッケージがインストールされないまま作成されたexeファイルは、実行時にエラーが発生します。
対処法:
- Pyinstallerによるexe化を行う前に、ゲームが正常に実行できるかを確認する
- ゲームが実行できなかった場合、必要パッケージをインストールする
ゲームアセットの依存関係は保たれているか
作成されたexeファイルとゲームアセットファイルの間には、Pygameスクリプトとゲームアセットファイルの関係が保たれている必要があります。
例えば、以下のようなファイル構成のPygameプロジェクトがあったとします。
. ├── main.py # Pygameスクリプト └── data # ゲームアセットフォルダ
main.py
から、data
フォルダは以下に配置された画像データ/音声データなどを参照しているような形です。
こちらをPyinstallerでexe化すると、次のように各ファイルが生成されます。
.
├── build
├── main.py
├── main.spec
├── data
├── __pycache__
└── dist
└── main.exe # 実行ファイル
ここでmain.exe
をそのまま実行しても、エラーを吐かれてしまいます。
アセットフォルダdata
がmain.exe
と同階層にないため、アセットを読み込むことが出来ないからです。
よって、アセットフォルダdata
を、main.exe
と同階層にコピーする必要があります。
└── dist
├── data # コピーしてくる
└── main.exe
対処法:
- exeファイルとゲームアセットフォルダの関係を、ゲームアセットフォルダとPygameスクリプトの関係で保持する
- 例) ゲームアセットフォルダをexeファイルの同階層にコピーする
Pygame終了時にsys.exit()しているか
ゲーム終了時には、sys.exit()
を実行する必要があります。
sys.exit()
が実行されない場合、exeファイルから実行したゲームを終了する際、エラーを吐かれてしまいます。
例えばゲーム終了の関数を用意する場合は、次のようにsys.exit()
を実行するようにします。
import pygame import sys def quit_game(): pygame.quit() sys.exit()
対処法:
- ゲーム終了時の処理で
sys.exit()
を実行する
おわりに
以上、PyinstallerでPygameスクリプトをexe化する際に発生したエラーへの対処法を3つ書きました。
エラーメッセージもあまり詳しく書かれないので、単純な原因でもエラーの対処に結構時間がかかりました。
Pygameでのゲーム開発はマイナーとは思いますが、同じ境遇のどなたかの参考になれば幸いです。
[関連記事]
www.bioerrorlog.work
参考
Making an Executable from a Pygame Game (PyInstaller) - YouTube