当我尝试在python-3.10.1 virtualenv(用python-3.9.0 venv创建并升级)中用PyAudio-0.2.11播放一个wave文件时,我收到了一个异常,什么都没有播放,其他的都很好。
Exception in thread WavPlayer:rsrc/sound.wav:
Traceback (most recent call last):
File "/usr/lib/python3.10/threading.py", line 1009, in _bootstrap_inner
self.run()
File "/Code/py/tetris/tetris.py", line 39, in run
self.play()
File "/Code/py/tetris/tetris.py", line 35, in play
self.stream.write(data)
File "/Code/py/tetris/.venv/lib/python3.10/site-packages/pyaudio.py", line 584, in write
pa.write_stream(self._stream, frames, num_frames,
SystemError: PY_SSIZE_T_CLEAN macro must be defined for '#' formats
我不知道'#' format
代表什么,我确信我的代码与C API无关,但它在python-3.9.x下运行良好,这是PyAudio库本身的问题吗?我该如何解决?
3条答案
按热度按时间yqkkidmi1#
不幸的是,Python 3.10中引入了一个突破性的变化(参见bpo-40943和PEP-0353),因此PyAudio需要更新。
编辑:这个问题从PyAudio 0.2.12开始就已经在上游得到了修复!下面的过渡留给后代,但是现在只需要一个简单的版本升级。
我已经提交了一个修复上游,但由于该项目自2017年以来一直没有更新,我不太确定它会多快得到审查。
同时,您可以自由地从源代码构建my fork并使用它:)
ohtdti5x2#
尸体解剖。
正如@skeh指出的,从 Python 3.10 开始,一些(向后兼容的)功能被故意禁用,这意味着一些扩展模块将不再工作 OOTB。
查看[GitHub]: python/cpython - PEP 353: Drop support for PyArg_ParseTuple() "#" formats when PY_SSIZE_T_CLEAN is not defined了解更多详细信息。
v0.2.12(在此期间发布)中修复了这些问题。
我构建了它们并将其放置在**[GitHub]: CristiFati/Prebuilt-Binaries - (master) Prebuilt-Binaries/PyAudio/v0.2.12。
还将(原始)*PyAudiorepo* 分叉到:[GitHub]: CristiFati/pyaudio - PyAudio
另一个软件包出现类似问题:[SO]: Can't install pyo using pip (@CristiFati's answer) .
kh212irz3#
我也遇到过这个错误。尝试安装各种pymongo版本直到解决。版本3.12为我解决了这个问题
pip install --upgrade pymongo=3.12