【问题标题】:Pyinstaller with pygamePyinstaller 与 pygame
【发布时间】:2023-02-18 22:08:09
【问题描述】:

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

有人知道这个的解决方案吗?

我正在尝试在 Ubuntu 14.10 上执行此操作。

-编辑-

更具体:

“似乎从不工作”意味着当我运行 PyInstaller 并构建应用程序时,它似乎可以工作并制作应用程序。当您尝试运行该应用程序时,什么也没有发生。

【问题讨论】:

    标签: python pygame pyinstaller


    【解决方案1】:

    我在 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 来说非常晦涩。

    【讨论】:

    • 太感谢了。经过大量的试验和错误后,我的程序与您的解决方案一起运行。我还想补充一点,无论出于何种原因,默认的 pygame 字体似乎都无法作为 exe 使用。 Font=pygame.font.SysFont(None,30) 应该更改为Font=pygame.font.Font("freesansbold.ttf", 20)并且freesansbold.tff文件应该添加到工作data目录和.spec文件,('data/freesansbold.ttf','data')对于任何其他试图让它工作的人我建议阅读这篇文章非常接近,因为有很多小的重要细节和区别。
    • 出于某种原因,如果名称参数(第一个)为 None 或字体名称不在系统字体列表中,pygame.font.SysFont 将使 exe 崩溃。
    【解决方案2】:

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

    【讨论】:

    • 是的,我找到了另一个名为 Nuitka 的应用程序,它适用于任何 Python 项目。
    猜你喜欢
    • 1970-01-01
    • 2017-09-12
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2020-12-08
    • 2017-05-03
    相关资源
    最近更新 更多