PyAudio.write系统错误:必须为'#'格式定义PY_SSIZE_T_CLEAN宏。

21

当我尝试在Python-3.10.1虚拟环境(使用Python-3.9.0 venv创建并升级)中使用PyAudio-0.2.11播放.wav文件时,我收到了一个异常并且没有声音输出,但其他部分都很好。

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个回答

19

不幸的是,Python 3.10 引入了一个重大变化(参见bpo-40943PEP-0353),因此需要更新 PyAudio。

编辑:自从 PyAudio 0.2.12 版本起,这个问题已经被修复。以下内容仅供参考,但现在只需要简单地升级版本即可。


我已向项目提交了修复补丁,但由于该项目自 2017 年以来就未更新,因此我不确定审核速度会有多快。

与此同时,您可以自由地从源代码中构建我的分支并使用它 :)


1
干得好!你的 Pyaudio 版本运行没有问题。 - Chris P

3

死后回帖。

正如@skeh所指出的,从Python 3.10开始,一些(向后兼容的)功能被故意禁用。这意味着一些扩展模块将不再OOTB工作。
请查看[GitHub]: python/cpython - PEP 353: Drop support for PyArg_ParseTuple() "#" formats when PY_SSIZE_T_CLEAN is not defined以获取更多详细信息。

PyAudiov0.2.11)就是这样的一个模块。
在此期间修复了问题,版本为v0.2.12

Python 3.11 .whls在回答时未发布到[PyPI]: PyAudio 0.2.12 - Download files(它们是之后添加的)。
我构建并将它们放在[GitHub]: CristiFati/Prebuilt-Binaries - (master) Prebuilt-Binaries/PyAudio/v0.2.12中。

还在以下位置分叉了(原始的)PyAudio repo[GitHub]: CristiFati/pyaudio - PyAudio

另一个软件包也存在类似的问题:[SO]: Can't install pyo using pip (@CristiFati's answer)


0

我也遇到过这个错误。 尝试安装各种pymongo版本,直到解决为止。 对我来说,版本3.12解决了问题

pip install --upgrade pymongo=3.12


2
我在使用Pymongo时也遇到了这个错误,在安装了pymongo==3.10.1之后,该错误消失了。 - Ionut-Alexandru Baltariu
1
PyMongo与问题无关。这不是答案,而是评论。-1。 - CristiFati

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接