我有一些产生音频的代码,有时由于不同的原因而产生声音。我想将生成的音频直接写入到wav文件中。但是,由于通过wave
位于with
上下文中,wave
试图关闭文件。现在,如果在过程的后期进行就可以了,但是如果是一开始,wave
并没有设置任何参数,并且死亡。
这是MWE:
from io import BytesIO
import wave
audio_out = BytesIO()
with wave.open(audio_out, "w") as file_out:
raise Exception('aaa!')
Error: # channels not specified
我能想到的最好的办法是,在任何更改都没有引起变化之前,在最顶部包含file_out.setparams((1, 1, 1, 1, 'NONE', ''))
,然后在有了真实参数的情况下覆盖它们。不过,感觉有点脏。有更好的解决方案吗?谢谢!
我尝试删除上下文管理器:
file_out = wave.open(audio_out, "w")
raise Exception('aaa!')
但是wave
仍然无条件关闭文件。文档实际上提到了这一点:Wave_write.close(): Make sure nframes is correct, and close the file if it was opened by wave. This method is called upon object collection. [...]
因此,在这种情况下发生的是,我得到了一个打印输出,上面写着Exception ignored in: <bound method Wave_write.__del__ of <wave.Wave_write object at 0x7ff549064eb8>> [...] wave.Error: # channels not specified
,仍然不令人满意。