Pyinstame与pygame

Fre*_*red 3 python pygame pyinstaller

我曾多次尝试使用PyInstaller捆绑我的Python2程序,但它似乎永远不会与Pygame模块一起使用.我在这个主题上看到了许多其他问题,但我找不到任何有用的答案.

有人知道解决方案吗?

我试图在Ubuntu 14.10上这样做.

-编辑-

更具体:

"似乎永远不会工作"意味着当我运行PyInstaller并构建应用程序时,它似乎可以工作并生成应用程序.当您尝试运行该应用程序时,没有任何反应.

Bob*_*igh 11

我在PyInstaller文档中搜索了很多东西,让自己的游戏运行起来.我对Ubuntu了解不多,但是我在Windows中使用了一切,它应该非常相似.这里的关键是让PyInstaller用你的Python代码打包你的资源(图像,声音等).最好的分发是使用pyinstaller --onefile main.py目录中的console命令来获取单个可执行文件.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')
Run Code Online (Sandbox Code Playgroud)

确保运行一次PyInstaller以使其创建.spec文件,即使生成的可执行文件不起作用.

a是一个收集可放入可执行文件的东西的对象.您想在datas=零件中添加您的资源文件夹.为此,请创建一个列表:

added_files = [
     ( 'data', 'data' ),
     ( 'sfx/*.mp3', 'sfx' ),
     ( 'src/README.txt', '.' )
     ]
Run Code Online (Sandbox Code Playgroud)

在这个例子中的第一行添加文件夹的所有内容data位于同一文件夹中,你main.specmain.py它添加到data可执行文件夹里面.您希望保持路径正常工作,因此元组的两个条目通常应该相同.第二行将所有.mp3文件从sfx 添加到exectuable中的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)
...
Run Code Online (Sandbox Code Playgroud)

最后一个非常重要的步骤是在main.py的开头添加这两行代码:

if getattr(sys, 'frozen', False):
    os.chdir(sys._MEIPASS)
Run Code Online (Sandbox Code Playgroud)

这里的技巧是,当您运行可执行文件时,PyInstaller会将所有数据文件解压缩到隐藏的_MEIPASS文件夹中.您希望将当前目录设置为此文件夹,以便代码找到您的资源并且您的路径保持有效.

最后,我建议您将该os.path.join函数用于代码中的所有路径.它将使路径可移植到其他平台.

另外,如果您使用--onedir选项,请执行相同的操作但添加两行:

if getattr(sys, 'frozen', False):
    os.chdir(os.path.dirname(sys.executable))
Run Code Online (Sandbox Code Playgroud)

如果执行此操作并且双击(在Windows中)时可执行文件立即关闭,则需要更改console=Falseconsole=True行,然后在StartMenu的搜索字段中键入cmd/k COMPLETEPATHTOYOUREXECUTABLE.这将运行您的.exe并保持控制台打开,以便您可以看到错误日志.它可能会要求你忘记包含一些文件,这样你可以将它添加到.spec,重建你的.exe并重pyinstaller main.spec试.

希望这对其他人也有帮助,对于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')` 对于任何其他试图让它工作的人,我建议仔细阅读这篇文章,因为有很多小的重要的细节和区别。 (3认同)

Rya*_*yan 0

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