这是简化的例子。我有这段代码:
from pygame import mixer
def say():
mixer.init()
mixer.music.load('/home/orif/Downloads/english.wav')
mixer.music.play()
while mixer.music.get_busy():
time.sleep(0.2)
它会显示一些警告,但效果很好。警告:
ALSA lib pcm_dsnoop.c:606:(snd_pcm_dsnoop_open)无法打开奴隶 ALSA lib pcm_dmix.c:1029:(snd_pcm_dmix_open)无法打开从属ALSA lib pcm.c:2266:(snd_pcm_open_noupdate)未知的PCM卡.pcm.rear ALSA lib pcm.c:2266:(snd_pcm_open_noupdate)未知的PCM cards.pcm.center_lfe ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) 未知的PCM cards.pcm.side ALSA lib pcm_dmix.c:1029:(snd_pcm_dmix_open)无法打开奴隶
但如果我在子进程中运行它,它将不会:
def test():
talk_process = Process(target=say)
talk_process.start()
print 'waiting for the process...'
talk_process.join()
print 'done'
它打印相同的警告,然后:
waiting for the process...
Process Process-1:
Traceback (most recent call last):
File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "/home/orif/Projects/example.py", line 178, in say
mixer.init()
error: No available audio device
done
如果我使用线程进行相同操作,它运行正常。我试过写了here和here。在前一个链接中,评论中的解决方案几乎帮助了我。我在运行子进程之前初始化了混合器:
mixer.init()
talk_process.start()
但现在声音没有播放,等待循环while mixer.music.get_busy()
无穷无尽
发生了什么以及如何解决?
答案 0 :(得分:0)
好吧,我的不好,在提出问题之前我没有检查过所有内容。上面的代码片段有点不完整。还有一些我觉得无关紧要的进口产品。我使用SpeechRecognition导入了我的模块。在代码中有一个函数声明,如下所示:
def foo(m = sr.Microphone()):
pass
在编写我认为的代码时,由于Python在最后可能的时刻执行所有操作,它也应该工作。当我运行该代码时,它确实如此,所以一切似乎都很好。我错了。
在函数声明时,该方法调用未被视为"如果没有给出参数,则替换为此调用的结果",但它实际上被调用并且返回值被用作可选参数。在多处理过程中,我不知道声卡究竟出了什么问题,但这就是我收到这些奇怪而模糊的错误信息的原因。
以下是展示导致问题的原因的一个小例子:
def foo():
print 'TRIGGERED'
return 42
def bar(a = foo()):
print a
if __name__ == '__main__':
pass
虽然看起来它应该什么都不做,但这段代码实际上打印了TRIGGERED。所以,不是像这样给可选参数赋值,而是做这样的事情:
def foo(a = None):
a = 'bar' if a is None else a