无法在 M1 Mac 上安装 PyAudio [PortAudio 已安装]。

7

我访问了很多论坛,尝试了像brew、pip、port等不同的方法,但仍然遇到相同的错误。

点击此处查看更多细节

src/_portaudiomodule.c:29:10: fatal error: 'portaudio.h' file not found
    #include "portaudio.h"
             ^~~~~~~~~~~~~
    1 error generated.
    error: command '/usr/bin/gcc' failed with exit code 1

有人可以帮忙吗?

8个回答

34

这些步骤适用于 M1 Pro 芯片

  1. 安装 portaudio
brew install portaudio
  1. 链接portaudio

brew link portaudio
  1. 复制 portaudio 安装的路径(在下一步中使用)
brew --prefix portaudio

创建一个.pydistutils.cfg文件放在你的主目录下。
sudo nano $HOME/.pydistutils.cfg

然后粘贴以下内容

[build_ext]
include_dirs=<PATH FROM STEP 3>/include/
library_dirs=<PATH FROM STEP 3>/lib/

  1. 安装pyaudio
pip install pyaudio

or

pip3 install pyaudio

1
谢谢,已选中!它对我有用!第三步是关键~! - Daming Lu

12

对我来说,这是:

brew install portaudio
python -m pip install --global-option='build_ext' --global-option='-I/opt/homebrew/Cellar/portaudio/19.7.0/include' --global-option='-L/opt/homebrew/Cellar/portaudio/19.7.0/lib' pyaudio

3
我刚刚执行了 brew install portaudio 命令,一切都很顺利。 - user5311618

6

本解决方案经过M1 Mac的测试[请与其他设备进行检查]。

在系统上安装HomeBrew后,执行PortAudio的安装。接下来按照下面的步骤进行操作:

使用以下命令安装PortAudio

sudo brew install portaudio

成功安装PortAudio后,输入以下命令。

sudo nano $HOME/.pydistutils.cfg

然后,在打开的窗口中输入以下行内容

[build_ext]
include_dirs=/Users/<enter-your-system-username>/homebrew/Cellar/portaudio/19.20140130/include/
include_dirs=/Users/<enter-your-system-username>/homebrew/Cellar/portaudio/19.20140130/lib/

注意:PortAudio的位置可能与您不同,并且不要忘记替换您的PC用户名。

最后运行以下命令:

pip install pyaudio

或者

pip3 install pyaudio


2
这个解决方案对我有效,但一开始我遇到了这个错误:pydistutils.cfg' [line 3]: option 'include_dirs' in section 'build_ext' already exists。在第一个include_dirs之后,我添加了一个新的部分build_ext_1用于第二个include_dirs,然后它就起作用了。 - Shend
@shend 你写的是哪几行代码?我不太确定理解了,但出现了和你一样的错误。 - DoPeT
你不能再以root身份运行自制软件了。所以首先按照这个解决方案操作,https://dev59.com/9GQn5IYBdhLWcg3w9bCi#34175205 。然后尝试不使用sudo来执行brew命令。 - M.Hossein Rahimi

4
我们面临的主要挑战是pyaudio不知道在哪里找到portaudio库,因为根据源代码,它只会在这些位置寻找darwin平台安装程序:
include_dirs += ['/usr/local/include', '/usr/include']
external_libraries_path += ['/usr/local/lib', '/usr/lib']

如果您使用的是Homebrew安装的portaudio,特别是在Apple Silicon上,那么这样做是不行的,因为PyPi中没有预构建的wheel。这意味着setuptools/pip需要从源代码构建软件包。

有几种方法可以配置setuptools以使用其他路径,包括传递参数,使用.pydistutils.cfg文件等,但对于我来说,第二个选项很适合,因为我要将pyaudio安装到几个Python环境中。

在以上答案的基础上,您可以复制以下内容,以一次性安装pyaudio。

# Install portaudio, will print list of paths where it's been installed if already done
brew list portaudio || brew install portaudio
# Link portaudio, will print a warning if already linked
brew link portaudio
# Create a pydistutils config file with the portaudio lib paths set correctly (no copying/pasting paths required)
cat <<EOF >> .pydistutils.cfg
[build_ext]
include_dirs=`brew --prefix portaudio`/include/
library_dirs=`brew --prefix portaudio`/lib/
EOF
# install (build) package with pip
python -m pip install pyaudio

我们所做的只是告诉setuptools在homebrew安装portaudio时也要查找C/C++头文件。

经过多次尝试,我终于找到了可行的方法!我曾尝试使用pip的全局配置,但它没有起作用。相反,这个解决方案似乎是有效的。 - Mattia Surricchio
运行此脚本后,不幸的是我在m1上遇到了以下错误。src/_portaudiomodule.c:31:10: 致命错误:找不到'portaudio.h'文件 #include "portaudio.h" - Felipe Valdes
如果有人知道如何修复,那么帮助肯定会很有用。 - Felipe Valdes

2

vkshah在第二行出现了错误。应该将include_dirs更改为library_dirs

include_dirs=/Users/<enter-your-system-username>/homebrew/Cellar/portaudio/19.20140130/include/
library_dirs=/Users/<enter-your-system-username>/homebrew/Cellar/portaudio/19.20140130/lib/```

这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Arnie97
它提供了“不需要询问者澄清的答案”,即vkshah给出的答案有一个错别字,这会使它不正确。除了代码片段之外,我还给出了非常清晰的解释(library_dirs而不是include_dirs)。那么,你更愿意让vkshah的原始答案保持不变(我非常感激,因为我完全被卡住了,这让我达到了95%的进展),还是拥有实际解决用户问题的正确答案? - MSP
1
抱歉,我对上面的话感到抱歉。我没有想到我的审核队列选择会触发那样粗鲁的自动机器人回复。我完全同意并感谢您关于vkshah答案的勘误。然而,我建议使用vkshah答案下的“编辑”或“改进此答案”链接,这对未来的读者更友好。在社区志愿者接受您的改进后,您将被认为是原始答案的编辑,并且这个单独的答案条目可以被删除。 - Arnie97

2
对于我而言,我在一台M1 Mac上运行Big Sur。我按照其他帖子中提到的所有说明执行以下操作:
  1. 安装portaudio

    arch -arm64 brew install portaudio

  2. 启动虚拟环境

    python3 -m venv env

    source env/bin/activate

  3. 安装pyaudio

    arch -arm64 pip install --no-cache-dir --global-option='build_ext' --global-option='-I/opt/homebrew/include' --global-option='-L/opt/homebrew/lib' pyaudio==0.2.11

TIP #1 如果你看到portaudio.h文件未找到的错误,请在末尾指定pyaudio版本。因为它一直试图安装版本“0.2.12”,但安装失败了。我将pyaudio的版本指定为“0.2.11”(如上所示)。 TIP #2 成功安装pyaudio后,您可能会看到错误PyAudio C模块_portaudio,这是由于pip在x86_64架构中生成了它(_portaudio.cpython-36m-darwin.so)。它与arm64 portaudio不兼容,在这种情况下,请确保在pip前面包含arch -arm64以构建正确的二进制文件。 TIP #3 使用较旧的python版本,我个人使用的是版本3.6
哦,确保单引号实际上是',如果你从文本编辑器中复制了命令。
希望这有所帮助!

1

首先,您需要使用Homebrew下载PortAudio

brew install portaudio

然后尝试直接安装Pyaudio

pip install pyaudio

如果在安装过程中出现错误,请按照以下步骤操作

或者

如果您遇到以下任何错误,可以按照以下步骤操作


错误 1

在“build_ext”部分中,选项“include_dirs”已经存在


错误 2

无法为 pyaudio 构建轮子,这是安装基于 pyproject.toml 的项目所需的。


错误 3

#include "portaudio.h" ^~~~~~~~~~~~~
1 个错误已生成。 错误:命令 '/usr/bin/clang' 以退出码 1 失败


解决方案从这里开始

安装Homebrew后,您必须将其链接起来

brew link portaudio

在某些情况下,它会说已经链接了,那么就简单地忽略它

我们需要portaudio的路径,确切地安装在哪里

brew --prefix portaudio

它会给出portaudio的路径

然后您需要检查pydistutils.cfg文件是否存在

sudo cat $HOME/.pydistutils.cfg

如果文件存在,则会打开它,否则将使用以下命令创建它

sudo cat $HOME/.pydistutils.cfg

因此,在这些文件中,我们必须定义正确的路径

[build_ext]
include_dirs=/--PATH--/include/
library_dirs=/--PATH--/lib/

您可以通过运行以下命令获取该路径

brew --prefix portaudio

如果该路径无效,请尝试以下路径

[build_ext]
include_dirs=/Users/<username>/homebrew/Cellar/portaudio/19.20140130/include/
library_dirs=/Users/<username>/homebrew/Cellar/portaudio/19.20140130/lib/

0

如果您使用的是Mac OS

  1. 安装Homebrew(在终端中插入链接:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" )

  1. 在终端中插入命令:

brew install portaudio

  1. 在终端中插入命令:

pip install pyaudio

附注:有时您需要升级pip安装程序

这些操作解决了我的问题(Mac OS Mojave 10.14.4)


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