pygame 的 Pyinstaller

Pyinstaller with pygame

我曾多次尝试使用 PyInstaller 来捆绑我的 Python2 程序,但它似乎永远无法与 Pygame 模块一起使用。我已经看到很多关于这个主题的其他问题,但我找不到任何有用的答案。

有人知道解决这个问题的方法吗?

我正在尝试在 Ubuntu 14.10.

-编辑-

更具体地说:

"never seems to work" 意味着当我 运行 PyInstaller 并构建应用程序时,它似乎可以工作并生成应用程序。当您尝试 运行 应用程序时,没有任何反应。

我建议尝试使用另一个程序(如 py2exe)来捆绑 python 程序,我目前没有遇到任何问题。他们有很多关于基于 cmd 的过程的优秀 youtube 视频。我在使用 pyinstaller 时遇到了一些个人问题,假设您的程序没有缺陷,我认为这只是错误。

我在 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.specmain.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.

非常晦涩