无法运行播放通过 cx_Freeze 编译的 OGG 文件的 Pygame 脚本

Posted

技术标签:

【中文标题】无法运行播放通过 cx_Freeze 编译的 OGG 文件的 Pygame 脚本【英文标题】:Can't run Pygame script that plays a OGG file compiled through cx_Freeze 【发布时间】:2013-04-02 04:11:34 【问题描述】:

当我编译以下脚本时:

# play.py

import os, re
import pygame.mixer

pygame.mixer.init(11025)
pygame.mixer.music.load('song.ogg')
pygame.mixer.music.play(-1)

os.system("PAUSE")

使用以下setup.py

from cx_Freeze import setup, Executable
exe = Executable(
script="play.py",
)

setup(
    executables = [exe]
    )

通过:

python setup.py build

执行 play.exe 给我以下错误:

Traceback (most recent call last):
  File "C:\Python33\lib\site-packages\cx_Freeze\initscripts\Console3.py", line 2
7, in <module>
    exec(code, m.__dict__)
  File "play.py", line 7, in <module>
pygame.error: Couldn't open 'song.ogg'

脚本在编译之前运行良好,是的,我确实将 song.ogg 放在了 exe 的目录中。顺便说一下 song.ogg 工作正常,我已经检查过了。有什么想法吗?

附:如果我将其更改为 song.wav ,它可以正常工作,但 WAV 文件对我来说太大而无法使用。 MP3 也不能正常工作。

【问题讨论】:

它可能需要一些插件来读取 ogg 文件,并且不会被复制到 exe 目录。如果它是 Python 模块,您可以告诉 cx_Freeze 它需要包含它 (docs)。如果是 DLL,可以指定为要复制的文件。 我已经尝试过了,在互联网上搜索建议我应该将 libvorbis.dll 复制到 exe 的目录,遗憾的是这似乎不起作用。我已经尝试联系有同样问题的人,他们说他们无法找到解决方案,不得不切换到另一种语言(如 LUA)。这是一个尴尬的问题,pygame应该是自己支持OGG的,即使我import pygame也不行。 切换到完全不同的语言似乎有点矫枉过正。一定有办法解决这个问题,但恐怕我不知道它是什么。尝试使用Process Explorer 查看当您的(解冻的)程序加载 ogg 文件时加载了哪些额外的 DLL。 通过 Process Explorer 我发现我需要将 libogg.dll、libvorbis.dll 和 libvorbisfile.dll 从 Python33\Lib\site-packages\pygame 复制到我的冻结程序的目录。像魅力一样工作。 很高兴听到这个消息。既然您自己找到了解决方案,您是否想将其写为答案并接受它,以便问题显示为已回答。 【参考方案1】:

通过Process Explorer,我发现我需要从Python33\Lib\site-packages\pygame 到我的冻结程序目录。

【讨论】:

【参考方案2】:

计算机无法打开 song.ogg 文件,因为 cx_freeze 未将歌曲包含在其编译中。您应该尝试将歌曲文件包含在setup.py 脚本中。使用如下所示的setup.py 脚本。

from cx_Freeze import setup, Executable

exe=Executable(
     script="play.py",
     base="Win32Gui",
     )
includefiles=[song.ogg]
includes=[]
excludes=[]
packages=[]
setup(

     version = "0.0",
     description = "Description",
     author = "Name",
     name = "Play",
     options = 'build_exe': 'excludes':excludes,'packages':packages,'include_files':includefiles,
     executables = [exe]
     )

【讨论】:

其实我已经把声音文件放在了冻结程序的目录下,我在问题上说的。反正问题已经解决了。【参考方案3】:

扩展您的答案,我为 mac 用户找到了此解决方案(假设您使用 Homebrew 安装 pygame):

    brew install libogg
    brew install libvorbis
    brew install sdl_mixer --with-libvorbis

如果您收到“警告:sol_mixer-1.2.12 已安装”的消息。运行第三条命令后,将其替换为以下内容:

    brew reinstall sdl_mixer --with-libvorbis

供参考:can't open sound files using pygame on a mac

【讨论】:

以上是关于无法运行播放通过 cx_Freeze 编译的 OGG 文件的 Pygame 脚本的主要内容,如果未能解决你的问题,请参考以下文章

在 cx_Freeze 编译后打开图片

无法使用 cx_freeze 和 PySide2 进行编译

运行使用 cx_freeze 编译的 exe 时如何查看错误消息?

开放图形协议 - og:movie 与 youtube 链接

SDL/Pygame 无法使用 cx_Freeze 加载 PNG 图像

cx_freeze 的 exe 错误