![](/img/trans.png)
[英]Pygame playing sound with pygame.mixer.music.load(file) gives NoneType error
[英]Python application won't exit when using stringIO and pygame.mixer.music.load()
我正在使用StringIO传输音乐数据,但是当我运行pygame.mixer.music.load()时,我的应用程序不会退出。 即使我使用close():
def PlaySong(self, song_id):
song = StringIO.StringIO(resp.read())
self.pygame.mixer.music.load(song)
....
该函数将返回,但必须终止该应用程序。 如果将响应保存到文件,然后加载文件名,它将关闭。 有人可以帮忙吗? 我不想使用本地存储。
更多信息。 我从文件中打开都使用了strace,并使用stringio对两个实例都正确退出了strace。 痕迹看起来很干净。
工作代码:
def playsong():
mp3 = "/home/adam/Documents/pinyin/pinyinchart_win/pinyin/zuo2.mp3"
#with open(mp3, "rb") as outfile:
# song = outfile.read()
#io = StringIO.StringIO(song)
pygame.init()
pygame.mixer.music.load(mp3)
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
pygame.time.Clock().tick(50)
#io.close()
#outfile.close()
不起作用的代码:
def playsong():
mp3 = "/home/adam/Documents/pinyin/pinyinchart_win/pinyin/zuo2.mp3"
with open(mp3, "rb") as outfile:
song = outfile.read()
io = StringIO.StringIO(song)
pygame.init()
#pygame.mixer.music.load(io)
pygame.mixer.music.load(mp3)
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
pygame.time.Clock().tick(50)
io.close()
outfile.close()
尝试sys.exit()和内置函数exit()。
我在尝试运行pykaraoke时经常遇到此问题; 直到今晚,我才将其追踪到pygame.mixer.music.play()。 奇怪的是,它仅在多处理器系统上发生; 如果我在单处理器系统上进行测试,或者使用“ maxcpus = 1”启动Linux,则不会发生。 否则,经常会发生硬挂,而我必须使用SIGKILL,因为SIGTERM无法正常工作。
所以我认为这是pygame中的错误,或它所依赖的东西。 我刚刚向pygame-users邮件列表发送了一个Python脚本和一个非常短的(50k)MP3文件。 如果有任何事情发生,我会报告。
更新:我能够通过与SDL_mixer直接交互的程序重现该错误。 答案是,这是smpeg中的错误。 在支持libmad的情况下重建SDL_mixer。 您还必须完全卸载smpeg,因为SDL_mixer会尝试使用它来代替libmad。
我有同样的问题-显然pygame本身很难清理,并且调用pygame.quit()
有时会挂起。 即使sys.exit()
实际上并没有退出,因为安装了一些错误处理的,也许pygame.init()
据#pygame
IRC频道上的人说,即使在邮件列表和项目网站上似乎仍然有活动,这个问题也永远不会得到解决,并且pygame是一个死项目(!?)。 也许这将在pygame2中修复...
使用Python的线程支持时,我已经看到了这种行为。 pygame可能正在使用线程,并且其中的某些线程是隐式生成的,未标记为“守护程序”线程,并且在尝试.quit()时未加入。
请注意, sys.exit()不太可能起作用,因为它会引发SystemExit异常(该异常可能会被捕获,尤其是被atexit处理程序捕获)。 同样, sys.exit()将仅退出处理该线程的线程,其他线程仍将运行。 ( StackOverflow:有关pygame中sys.exit()的更多信息)。
这是另一个: StackOverflow:当我关闭pygame屏幕时,它会冻结 。
我在以下短语中尝试了多种Google搜索:pygame退出{失败,挂起,停顿} ...,其中大多数引发了与我在此处提供的类似讨论。
共识似乎是您希望构造线程以处理“退出”事件,以便所有线程在您的主(父)进程尝试使用sys.exit()或退出之前都调用pygame.quit()。 _ _main_
_套件的。
除此之外,我还将检查音乐设备上是否有进程,线程或驱动程序停滞。 在类Unix的系统中,进程列表( ps
命令输出)将显示为“ D”状态。 (通过您提到的strace ,我假设您正在Linux上运行)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.