我只是一个脚本黑客,在命令行工具方面是个白痴。但我真的很想将我的 python 游戏打包成一个 Windows 可执行文件。我与 pyinstaller 搏斗了好几天,并阅读了其他人也试图弄清楚的所有线程,我还多次阅读了所有 pyinstaller 文档。没有一种解决方案对我有用,但经过多次试验和错误,我终于偶然发现了成功的秘诀,并想分享它,以防万一还有其他 pygame 开发人员对此表示反对。该解决方案包含多个线程的点点滴滴。
如何在 Windows 上使用 pyinstaller 创建具有多个资产目录的多文件 python pygame 的单个文件 exe:
首先,安装pyinstaller。
打开 Windows 命令提示符,输入:
pip install pyinstaller
制作一个python游戏。假设主游戏文件名为 main_game_script.py,位于
C:\Users\USERNAME\Documents\python\game_dir
将此函数添加到 main_game_script.py。确保导入 os 和 sys。 (我自己永远不会想到我需要将此功能添加到我的游戏中,但它确实有效,所以感谢在其他线程中发布它的人)
import sys
import os
def resource_path(relative_path):
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
要将图像加载到游戏中,请调用该函数,如下所示:
asset_url = resource_path('assets/chars/hero.png')
hero_asset = pygame.image.load(asset_url)
当您的游戏准备好打包到 EXE 中时,请打开 Windows 命令提示符。进入游戏主目录并输入:
pyinstaller --onefile main_game_script.py
看起来像这样:
C:\Users\USERNAME\Documents\python\game_dir>pyinstaller --onefile main_game_script.py
这将创建四个重要的项目:
- a main_game_script.spec file in the game_dir
- a 'build' dir in the game_dir
- a 'dist' directory in the game_dir
- a main_game_script.exe will be created in the 'dist' directory.
运行该命令会产生大量警告和日志。我不知道这一切意味着什么。但只要最终输出行显示成功,您可能就很好。
您的 exe 将无法运行。首先,您必须修改 .spec 文件(现在存在于 game_dir 中)以将所需的游戏资源路径添加到 exe:
在记事本或其他任何东西中打开 main_game_script.spec 文件。
用类似的资产目录路径替换空的 datas[] 列表(使用元组!):
datas=[('assets/chars/*','assets/chars'),('assets/tiles/*.png','assets/tiles'),('assets/fonts/*','assets/fonts')],
每个元组的第一个值是您要导入的实际文件名。
第二个值是 main_game_script.py 的相对路径
语法和路径一定要完美,不然不行也不会报错
保存并关闭“main_game_script.spec”文件。返回到您的 Windows 命令提示符。类型:
pyinstaller main_game_script.spec
像这样:
C:\Users\USERNAME\Documents\python\game_dir>pyinstaller main_game_script.spec
这会以某种方式将资产目录路径嵌入到您已经构建的 exe 中
完成所有这些(完成 100 次后只需几分钟),您终于有了一个包含所有游戏资产的 Python 游戏的单个文件 EXE。如果你做的一切都正确,双击EXE来玩你的python游戏。
注意:第一次做对花了我几天时间。我从一个带有最少代码的简单 test_game_script.py 开始,并有条不紊地进行迭代,在每次迭代中添加更多资产路径和复杂性,这样我就可以隔离出什么被破坏了以及为什么。如果您的游戏没有正确转换为 EXE,请从一个包含一个资产的简单 5 行游戏脚本开始,然后在其上慢慢构建,直到您有一个可以工作的管道,然后将该有效的资产管道应用到您的 ACTUAL 游戏中。否则将无法隔离问题。