BioErrorLog Tech Blog

試行錯誤の記録

“Failed to execute script XX” エラー対処: PyinstallerでPygameをexe化するときの注意点

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つの注意点があります。

  1. Pygameスクリプト内のimportパッケージはインストールされているか
  2. ゲームアセットの依存関係は保たれているか
  3. 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をそのまま実行しても、エラーを吐かれてしまいます。 アセットフォルダdatamain.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

www.bioerrorlog.work

参考

Making an Executable from a Pygame Game (PyInstaller) - YouTube

python - "Failed to execute script myscript" when exiting pygame window without console open after converting to .exe with pyinstaller - Stack Overflow