1. 首先,安装pyinstaller。(注意:我自己打包是win10 pycharm中完成的,linux中打包应该直接生成不了exe文件)
pip install pyinstaller
制作一个Python游戏。假设主游戏文件名为 main.py,位于 D:\game_project
2. 将下面函数添加到 main.py 中。(注意:这个是最新版pyinstaller适用的代码,其他版本的resource_path函数,试过之后好像不太行)
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)
3. 在main.py所有要使用路径将图像加载到游戏中的地方,调用该函数,下面是一个例子:
# 注意不是 pygame.image.load('assets/chars/hero.png')
hero_asset = pygame.image.load(resource_path('assets/chars/hero.png'))
4. 当游戏准备好打包到 EXE 中时。terminal转到主游戏目录并输入:
pyinstaller -w --onefile .\main.py --collect-data .\assets\audio --collect-data .\assets\fonts --collect-data .\assets\fruits --collect-data .\assets\pictures --collect-data .\assets\
powerups --hidden-import glcontext
其中,
- -w / –windowed/–noconsole 表示程序启动的时候不会打开命令行,这样当exe文件运行有问题时会弹出报错窗口显示出错误信息,方便调试。否则,弹出的命令行会自动关闭,不容易查错
- -F / --onefile 表示打包成单个文件
- main.py是游戏的主程序
- --collect-data .\assets\audio --collect-data .\assets\fonts --collect-data .\assets\fruits --collect-data .\assets\pictures --collect-data .\assets\powerups 是存放其他资源(图片,音频)的文件夹
- --hidden-import glcontext 是为了防止运行exe时出现下面的错误:
traceback (most recent call last): file "main.py", line 465, in <module> file "moderngl\__init__.py", line 2174, in create_context modulenotfounderror: no module named 'glcontext'
5. 修改 .spec 文件(与main.py在同一文件夹中),将空的 datas[] 列表替换为assets目录路径,如下所示(使用元组!):
datas = [('.\\assets\\audio\\*','.\\assets\\audio'),('.\\assets\\fruits\\*png','.\\assets\\fruits'),('.\\assets\\fonts\\*','.\\assets\\fonts'),('.\\assets\\pictures\\*','.\\assets\pictures'),('.\\assets\\powerups\\*.png','.\\assets\\powerups'),('.\\assets\\frag_shader.glsl','.\\assets'),('.\\assets\\vert_shader.glsl','.\\assets')]
每个元组的第一个值是导入的实际文件名,第二个值是资源文件夹相对路径 (注意,不要使用'\',’/‘,我都试过会报错)
6. 保存并关闭“main.spec”文件:(注意,一定要保存,且关闭,再执行下面的命令,否则可能不会应用更改)
7. 打开terminal,输入:
pyinstaller main.spec
这就已经将assets目录路径中所有资源嵌入到构建的 exe 中了。
完成所有这些操作,就可以双击 EXE 来玩 Python 游戏了。
将exe发送给任何人,或者重命名都可以直接双击打开游戏。
参考链接:
https://stackoverflow.com/questions/54210392/how-can-i-convert-pygame-to-exe
https://stackoverflow.com/questions/72822188/freezing-python-moderngl-application-with-pyinstaller
Python升级之路( Lv13 ) pyinstaller 使用详解-腾讯云开发者社区-腾讯云