python PyAudio.写入系统错误:必须为“#”格式定义PY_SSIZE_T_CLEAN宏

tjrkku2a  于 2022-12-17  发布在  Python
关注(0)|答案(3)|浏览(532)

当我尝试在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库本身的问题吗?我该如何解决?

yqkkidmi

yqkkidmi1#

不幸的是,Python 3.10中引入了一个突破性的变化(参见bpo-40943PEP-0353),因此PyAudio需要更新。
编辑:这个问题从PyAudio 0.2.12开始就已经在上游得到了修复!下面的过渡留给后代,但是现在只需要一个简单的版本升级。
我已经提交了一个修复上游,但由于该项目自2017年以来一直没有更新,我不太确定它会多快得到审查。
同时,您可以自由地从源代码构建my fork并使用它:)

ohtdti5x

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了解更多详细信息。

  • PyAudio*(v0.2.11)就是这样一个模块。
    v0.2.12(在此期间发布)中修复了这些问题。
  • Python 3.11**.whl*s没有在[PyPI]上发布:PyAudio 0.2.12 -下载文件。

我构建了它们并将其放置在**[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) .

kh212irz

kh212irz3#

我也遇到过这个错误。尝试安装各种pymongo版本直到解决。版本3.12为我解决了这个问题
pip install --upgrade pymongo=3.12

相关问题