我在 PyInstaller 文档中进行了大量搜索,以使我自己的游戏正常运行。我对 Ubuntu 了解不多,但我在 Windows 中得到了所有的东西,它应该非常相似。这里的关键是让 PyInstaller 将您的资源(图像、声音等)与您的 Python 代码打包在一起。最好的分发是在您的目录中使用 pyinstaller --onefile main.py 控制台命令来获取单个可执行文件。 PyInstaller 将创建一个 dist 文件夹和一个 main.spec 文件。 .spec 文件包含 PyInstaller 用于制作可执行文件的所有选项。对于 --onefile 可执行文件,它应该如下所示:
# -*- mode: python -*-
block_cipher = None
a = Analysis(['..\src\bitmessagemain.py'],
pathex=['C:\example\pyinstaller\bitmessagemain'],
binaries=None,
datas=None,
hiddenimports=[],
hookspath=None,
runtime_hooks=None,
excludes=None,
win_no_prefer_redirects=None,
win_private_assemblies=None,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
a.binaries, 'BINARY')],
name='bitmessagemain',
debug=False,
strip=None,
upx=True,
console=False , icon='src\images\can-icon.ico')
确保运行一次 PyInstaller 以让它创建 .spec 文件,即使生成的可执行文件不起作用。
a 是一个收集东西以放入您的可执行文件的对象。你想在 datas= 部分添加你的资源文件夹。为此,创建一个列表:
added_files = [
( 'data', 'data' ),
( 'sfx/*.mp3', 'sfx' ),
( 'src/README.txt', '.' )
]
此示例中的第一行添加与main.spec 和main.py 位于同一文件夹中的文件夹data 的所有内容,并将其添加到可执行文件内的data 文件夹。你想保持你的路径有效,所以元组的两个条目通常应该是相同的。第二行将 sfx 中的所有 .mp3 文件添加到可执行文件中的 sfx 文件夹中,依此类推。在此列表中添加所有资源,并注意保持路径有效。
然后你可以修改你的 .spec (这是标准的 python 代码):
# -*- mode: python -*-
block_cipher = None
added_files = [ #Any variable name works
( 'data', 'data' ),
( 'sfx/*.mp3', 'sfx' ),
( 'src/README.txt', '.' )
]
a = Analysis(['..\src\bitmessagemain.py'],
pathex=['C:\example\pyinstaller\bitmessagemain'],
binaries=None,
datas=added_files, #Dont forget to change this line!
hiddenimports=[],
hookspath=None,
runtime_hooks=None,
excludes=None,
win_no_prefer_redirects=None,
win_private_assemblies=None,
cipher=block_cipher)
...
最后一个非常重要的步骤是在 main.py 的开头添加这两行代码:
if getattr(sys, 'frozen', False):
os.chdir(sys._MEIPASS)
这里的技巧是,当您运行可执行文件时,PyInstaller 会将所有数据文件解压缩到一个隐藏的 _MEIPASS 文件夹中。您希望将当前目录设置为该文件夹,以便您的代码找到您的资源并且您的路径保持有效。
最后,我建议您对代码中的所有路径使用 os.path.join 函数。它将使路径可移植到其他平台。
附带说明一下,如果您使用 --onedir 选项,请执行相同的操作,但添加两行:
if getattr(sys, 'frozen', False):
os.chdir(os.path.dirname(sys.executable))
如果您执行此操作并且您的可执行文件在双击时立即关闭(在 Windows 中),您需要将 console=False 更改为 console=True 行,然后在开始菜单的搜索字段中键入 cmd /k COMPLETEPATHTOYOUREXECUTABLE。这将运行您的 .exe 并保持控制台打开,以便您可以看到错误日志。它可能会要求您提供一些您忘记包含的文件,这样您就可以将其添加到 .spec 中,用 pyinstaller main.spec 重建您的 .exe,然后重试。
希望这对其他人也有帮助,网络上的信息对于 PyInstaller+Pygame 来说非常晦涩。