繁体   English   中英

使用stringIO和pygame.mixer.music.load()时,Python应用程序不会退出

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM