最近,我做了一个pygame游戏。我想把它展示给我的朋友们。但不幸的是,我无法制作可执行文件,只能制作.py
文件。我尝试使用诸如py2exe
之类的工具,这些工具可能不支持Python 3.6和pyinstaller
。我认为pyinstaller
可能有用,而且我也可以成功制作一个exe文件,但是根本没有用。它只是表明它无法打开已经在同一文件中的声音文件。
我尝试了两种方法来加载文件,首先,加载路径,然后转换为exe的文件显示它无法打开与exe相同路径的文件。
其次,我使用了os.path
,该文件显示exe无法打开...../temp/...
,这是很长的路,但是我的计算机根本没有此文件夹。
我是一个学习python的新手。我已经搜索了一天,但无法正常工作。你能帮我吗?
答案 0 :(得分:2)
我只是一个脚本黑客,在命令行工具方面是个白痴。但是我真的很想将我的python游戏打包到Windows可执行文件中。我花了几天的时间与pyinstaller进行了角力,并阅读了其他也试图弄清楚它的其他人的所有线程,并且还多次阅读了所有pyinstaller文档。没有一个解决方案对我有用,但是在经过反复试验之后,我终于跌跌撞撞地找到了成功的秘诀,并想与他人分享,以防万一还有其他pygame开发人员对此表示反对。该解决方案包含几个线程的零碎部分。
如何在Windows上使用pyinstaller创建具有多个资产目录的多文件python pygame的单个文件exe:
首先,安装pyinstaller。
打开Windows命令提示符,键入:
pip install pyinstaller
制作一个python游戏。假设主游戏文件名为main_game_script.py,位于
C:\Users\blueb\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\blueb\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\blueb\Documents\python\game_dir>pyinstaller main_game_script.spec
这会以某种方式将资产目录路径嵌入到您已经构建的exe文件中
完成所有这些步骤(完成100次后仅需几分钟),您终于有了一个包含所有游戏资产的python游戏的单个文件EXE。如果一切正确,请双击EXE来运行python游戏。
注意:我第一次花了点时间才花了几天时间。我从一个简单的test_game_script.py开始,它使用最少的代码并有条不紊地进行了迭代,每次迭代都增加了资产路径和复杂性,因此我可以找出损坏的原因。如果您的游戏无法正确转换为EXE,请从一个只有一项资产的简单5行游戏脚本开始,并在此脚本上慢慢构建,直到您拥有有效的管道为止,然后将该功能资产管道应用于您的ACTUAL游戏。否则,不可能找出问题所在。
答案 1 :(得分:0)
1。添加--hidden-import pygame
。
类似的东西:
python -m PyInstaller <options> xxx.py --hidden-import pygame
2。破解pygame标准输出。
如果您使用选项-w
,它将由于pygame(讨厌的)版本输出而失败。
解决方法:
import contextlib
with contextlib.redirect_stdout(None):
import pygame
答案 2 :(得分:0)
我也遇到了同样的问题,花了几天时间在谷歌上搜索。今天终于明白是什么问题了。 在尝试转换它之前,请记住也通过终端安装 Pygame。只需输入“pip install pygame”