如何在苹果 M1 芯片的笔记本电脑上安装 GRPCIO?

40

每次我尝试在 .direnv 项目中安装一个依赖于GRPCIO的 pip 包,都会因为我的架构是arm64而导致构建失败。在等待GRPCIO团队发布更新的同时,我该如何解决这个问题?

  Using cached grpcio-1.34.0.tar.gz (21.0 MB)
    ERROR: Command errored out with exit status 1:
     command: /Users/yoav/Library/Caches/pypoetry/virtualenvs/orca-g6p4a6cZ-py3.8/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/jj/r3j0p91s2qgdpcpf5ptqr9qm0000gn/T/pip-install-n05vw0u0/grpcio_103d947f24954cde8b8a019b4c9f88fe/setup.py'"'"'; __file__='"'"'/private/var/folders/jj/r3j0p91s2qgdpcpf5ptqr9qm0000gn/T/pip-install-n05vw0u0/grpcio_103d947f24954cde8b8a019b4c9f88fe/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /private/var/folders/jj/r3j0p91s2qgdpcpf5ptqr9qm0000gn/T/pip-pip-egg-info-z41yqiw6
         cwd: /private/var/folders/jj/r3j0p91s2qgdpcpf5ptqr9qm0000gn/T/pip-install-n05vw0u0/grpcio_103d947f24954cde8b8a019b4c9f88fe/
    Complete output (10 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/var/folders/jj/r3j0p91s2qgdpcpf5ptqr9qm0000gn/T/pip-install-n05vw0u0/grpcio_103d947f24954cde8b8a019b4c9f88fe/setup.py", line 359, in <module>
        if mac_target and (pkg_resources.parse_version(mac_target) <
      File "/Users/yoav/Library/Caches/pypoetry/virtualenvs/orca-g6p4a6cZ-py3.8/lib/python3.8/site-packages/pkg_resources/__init__.py", line 113, in parse_version
        return packaging.version.Version(v)
      File "/Users/yoav/Library/Caches/pypoetry/virtualenvs/orca-g6p4a6cZ-py3.8/lib/python3.8/site-packages/pkg_resources/_vendor/packaging/version.py", line 275, in __init__
        match = self._regex.search(version)
    TypeError: expected string or bytes-like object
    ASM Builds for BoringSSL currently not supported on: macosx-11-arm64
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

这个神秘的requirements.txt文件是什么?我好像没有找到它。 - Timo Huovinen
但是这个问题使用的是requirements.txt文件中的内容吗? - Timo Huovinen
基本上,任何需要 grpcio 的依赖项,不管是手动安装还是在 Python 项目的 requirements.txt 文件中存在的,都可能存在这个 arm-64 问题。 - reka18
请返回已翻译的文本:https://stackoverflow.com/search?q=%5Bpython%5D+ASM+Builds+for+currently+not+supported+on. - Ulrich Eckhardt
10个回答

71

这似乎工作得很好,可以在终端中执行以下操作

export GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1
export GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1

然后安装您想要安装的任何软件包,在我的情况下,我正在尝试安装firebase admin,我必须运行以下命令

pip install firebase-admin

如果您只想安装grpcio,则只需运行以下命令

pip install grpcio

我发现这个帖子对于深入理解这个问题非常有帮助。https://github.com/grpc/grpc/issues/25082


3
为了使它对我有效,我需要设置一些额外的变量:export CFLAGS="-I/opt/homebrew/opt/openssl/include" export LDFLAGS="-L/opt/homebrew/opt/openssl/lib" - Martim
1
最终这个方法对我没起作用。安装过程虽然成功,但之后我还是遇到了一些错误。更简单的方法是使用conda安装。请参见我的回答:https://dev59.com/fFEG5IYBdhLWcg3wZcdh#71241793 - CGFoX
1
按原样使用对我起作用 - leosok
就我而言,“原样”运行良好。 - hannes ach
进一步解释一下,当我使用conda环境时,这个方法对我来说是有效的。当我使用venv(即通过python -m venv ...)时,我还需要@Martim提供的CFLAGSLDFLAGS变量。因此,如果这个方法不能直接使用,你也可以尝试添加额外的标志。 - undefined

25
CFLAGS="-I /opt/homebrew/opt/openssl/include" LDFLAGS="-L /opt/homebrew/opt/openssl/lib" GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1 GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1 pip install -r requirements.txt

这对我的mac book pro M1 bigsur有效。感谢解决方案。


1
请提供您的答案解释,以便其他用户更好地理解它。 - Elydasian
这个解决方案对我很有效,但是我还不得不降级到Python 3.9.12。 - ok123jump

16

我发现了一个解决方案,参考了https://github.com/grpc/grpc/issues/25082的更详细说明并删除了一些不必要的步骤。请注意,截至本帖发布日期,此方法仅适用于Python 3.9版本。

首先,安装pyenvpyenv-virtualenv

brew install pyenv pyenv-virtualenv

请注意,在Apple M1电脑上,仅仅添加eval "$(pyenv init -)"可能需要调整shell评估变量,此方法可能无法生效。相反,请运行以下命令:

pyenv init - >> .zshrc
pyenv virtualenv-init - >> .zshrc

然后前往您的Python项目目录并创建一个 .envrc 文件,并将其与 direnv 注册。

echo 'layout pyenv 3.9.1' > .envrc
direnv allow

接下来,您可以通过以下方式安装requirements.txt

GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1 GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1 pip install -r requirements.txt
Collecting google-cloud-pubsub
  Using cached google_cloud_pubsub-2.3.0-py2.py3-none-any.whl (210 kB)
Collecting proto-plus>=1.7.1
  Using cached proto_plus-1.17.0-py3-none-any.whl (42 kB)
Collecting grpc-google-iam-v1<0.13dev,>=0.12.3
  Using cached grpc-google-iam-v1-0.12.3.tar.gz (13 kB)
Collecting libcst>=0.3.10
  Using cached libcst-0.3.17-py3-none-any.whl (507 kB)
Collecting google-api-core[grpc]<2.0.0dev,>=1.22.2
  Using cached google_api_core-1.26.1-py2.py3-none-any.whl (92 kB)
Collecting protobuf>=3.12.0
  Using cached protobuf-3.15.6-py2.py3-none-any.whl (173 kB)
Collecting grpcio<2.0.0dev,>=1.0.0
  Using cached grpcio-1.36.1.tar.gz (21.5 MB)
Collecting googleapis-common-protos[grpc]<2.0.0dev,>=1.5.2
  Using cached googleapis_common_protos-1.53.0-py2.py3-none-any.whl (198 kB)
Collecting typing-inspect>=0.4.0
  Using cached typing_inspect-0.6.0-py3-none-any.whl (8.1 kB)
Processing /Users/rkmacmini/Library/Caches/pip/wheels/b7/a5/c4/504d913c2a55bb09c607541578ec5f844d1ff33467abe93ba5/PyYAML-5.4.1-cp39-cp39-macosx_11_0_arm64.whl
Collecting typing-extensions>=3.7.4.2
  Using cached typing_extensions-3.7.4.3-py3-none-any.whl (22 kB)
Collecting six>=1.13.0
  Using cached six-1.15.0-py2.py3-none-any.whl (10 kB)
Collecting google-auth<2.0dev,>=1.21.1
  Using cached google_auth-1.27.1-py2.py3-none-any.whl (136 kB)
Collecting pytz
  Using cached pytz-2021.1-py2.py3-none-any.whl (510 kB)
Requirement already satisfied: setuptools>=40.3.0 in ./.direnv/python-3.9.1/lib/python3.9/site-packages (from google-api-core[grpc]<2.0.0dev,>=1.22.2->google-cloud-pubsub->-r requirements.txt (line 1)) (49.2.1)
Collecting packaging>=14.3
  Using cached packaging-20.9-py2.py3-none-any.whl (40 kB)
Collecting requests<3.0.0dev,>=2.18.0
  Using cached requests-2.25.1-py2.py3-none-any.whl (61 kB)
Collecting mypy-extensions>=0.3.0
  Using cached mypy_extensions-0.4.3-py2.py3-none-any.whl (4.5 kB)
Collecting pyasn1-modules>=0.2.1
  Using cached pyasn1_modules-0.2.8-py2.py3-none-any.whl (155 kB)
Collecting cachetools<5.0,>=2.0.0
  Using cached cachetools-4.2.1-py3-none-any.whl (12 kB)
Collecting rsa<5,>=3.1.4; python_version >= "3.6"
  Using cached rsa-4.7.2-py3-none-any.whl (34 kB)
Collecting pyparsing>=2.0.2
  Using cached pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)
Collecting idna<3,>=2.5
  Using cached idna-2.10-py2.py3-none-any.whl (58 kB)
Collecting urllib3<1.27,>=1.21.1
  Downloading urllib3-1.26.4-py2.py3-none-any.whl (153 kB)
     |████████████████████████████████| 153 kB 1.1 MB/s
Collecting certifi>=2017.4.17
  Using cached certifi-2020.12.5-py2.py3-none-any.whl (147 kB)
Collecting chardet<5,>=3.0.2
  Using cached chardet-4.0.0-py2.py3-none-any.whl (178 kB)
Collecting pyasn1<0.5.0,>=0.4.6
  Using cached pyasn1-0.4.8-py2.py3-none-any.whl (77 kB)
Using legacy 'setup.py install' for grpc-google-iam-v1, since package 'wheel' is not installed.
Using legacy 'setup.py install' for grpcio, since package 'wheel' is not installed.
Installing collected packages: six, protobuf, proto-plus, grpcio, googleapis-common-protos, grpc-google-iam-v1, mypy-extensions, typing-extensions, typing-inspect, pyyaml, libcst, pyasn1, pyasn1-modules, cachetools, rsa, google-auth, pytz, pyparsing, packaging, idna, urllib3, certifi, chardet, requests, google-api-core, google-cloud-pubsub
    Running setup.py install for grpcio ... done
    Running setup.py install for grpc-google-iam-v1 ... done
Successfully installed cachetools-4.2.1 certifi-2020.12.5 chardet-4.0.0 google-api-core-1.26.1 google-auth-1.27.1 google-cloud-pubsub-2.3.0 googleapis-common-protos-1.53.0 grpc-google-iam-v1-0.12.3 grpcio-1.36.1 idna-2.10 libcst-0.3.17 mypy-extensions-0.4.3 packaging-20.9 proto-plus-1.17.0 protobuf-3.15.6 pyasn1-0.4.8 pyasn1-modules-0.2.8 pyparsing-2.4.7 pytz-2021.1 pyyaml-5.4.1 requests-2.25.1 rsa-4.7.2 six-1.15.0 typing-extensions-3.7.4.3 typing-inspect-0.6.0 urllib3-1.26.4

注意:一些参考资料说你需要将CFLAGS等指向brew安装的openssl位置,但这在我的情况下似乎不是必需的。如果出现问题,您可以尝试使用启用了CFLAGS的命令。

CFLAGS="-I /opt/homebrew/opt/openssl/include" LDFLAGS="-L /opt/homebrew/opt/openssl/lib" GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1 GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1 pip install -r requirements.txt

好的,所以我在我的苹果M1 Macmini上不需要CFLAGS版本,但是在我的苹果M1 Macbook Pro上需要...非常奇怪。 - reka18
4
可以确认这个解决方案适用于Macbook Pro M1,在浪费了大约一个小时之后,这是第一个有效的解决方案。谢谢! - gabrielprc
我也遇到了psycopg2的问题,不得不更改标志(flag)。尽管使用最新的命令解决了这个问题。谢谢@reka18! - Gabriel Viviani
即使在MacBook M1 Pro上使用CFLAGS标志,也无法正常工作! - Mohammad Aqajani

14

有一个更简单、更可靠的选择:

pip uninstall grpcio
conda install grpcio

1
实际上,目前普通的 pip install grpcio 看起来是有效的。 - reka18
好的,我之前尝试使用旧版本(Python 3.8.5),但在我的conda环境中失败了,不过conda install grpcio是可以的。 - CGFoX
2
在尝试了各种解决方案后,最终有效的方法是“conda install grpcio”。使用conda-forge频道。显然,社区投入了大量工作,使软件包能够与M1/arm64架构良好地配合使用。非常感谢您和所有人的努力。 - Cygorger

9

编辑:自版本1.51.3起,Google现在为苹果芯片的Mac提供官方grpcio构建。不再需要下载非官方二进制文件。

不幸的是,Google没有为苹果芯片Mac编译grpcio wheels。正如这个问题中所述,用户已经尝试使用各种编译器标志在M1上编译库,但并不总是有效。

为了解决这些问题,我发布了grpcio-mac-arm-build存储库,其中包含一个每日的GitHub Actions作业,用于为Apple Silicon编译最新稳定的grpciogrpcio-tools发行版。编译后的Python 3.8、3.9、3.10和3.11版本的wheels可在“Releases”页面下载。所有内容都是开源的,并且与grpcio库具有相同的许可证。这样,您就无需自己编译库文件了。


2
非常感谢!这是唯一一个真正起作用的解决方案。 - Martin Winter
2
谢谢,这个完美地运行了。只需要pip安装你的wheel文件就可以了! - Derek Chia
编辑更新救了我 - pip install grpcio==1.51 移除了错误。 - Agile Bean
如果有人在尝试在Windows上为Arm安装grpcio时遇到问题(例如在Apple Silicon Mac上的Parallels Desktop中),请注意:不要使用ARM64 Python安装程序!该配置没有预编译的二进制文件。您可以使用64位的Intel Python,它将能够正常构建。 - undefined

2
经过多次尝试,我最终通过运行以下命令成功安装了它:
xcode-select --install
brew install openssl re2

export LDFLAGS="-L$(/opt/homebrew/bin/brew --prefix openssl)/lib -L$(/opt/homebrew/bin/brew --prefix re2)/lib" 
export CPPFLAGS="-I$(/opt/homebrew/bin/brew --prefix openssl)/include -I$(/opt/homebrew/bin/brew --prefix re2)/include" 

GRPC_BUILD_WITH_BORING_SSL_ASM="" 
GRPC_PYTHON_BUILD_SYSTEM_RE2=true 
GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=true 
GRPC_PYTHON_BUILD_SYSTEM_ZLIB=true 

pip install grpcio

从这里获取:https://candid.technology/error-command-usr-bin-clang-failed-with-exit-code-1/

这样做是行不通的,因为那些 GRPC_ 的 shell 变量只对 shell 可见,而不对 pip 命令可见。要么将它们全部放在同一行,要么在每个 GRPC_ 变量前加上 export 前缀,这样它们就会对从该 shell 启动的所有命令可见。 - undefined

2

您不再需要做任何操作。现在,由于社区对Apple Silicon的支持已经跟上,所有事情都可以直接使用。祝您编码愉快!


你能展示一个可工作的例子吗?我无法在使用Python 3.11.6-alpine和grpcio 1.59.2的Dockerfile中使其工作。 - undefined

0

我成功让它工作了,而没有改变我的操作系统中的任何变量。这似乎与Python版本有关...我尝试使用3.7.12失败了,3.8.12也失败了。最终,我使用了3.10.2才成功安装了这个软件包。


0

对我来说,所有的建议都没有起作用。下面是有效的方法(假设你已经安装了Homebrew):

  1. 运行brew install miniconda(按照指示继续执行conda init "$(basename "${SHELL}")")。
  2. 要么source your ~/.zshrc,要么关闭终端并重新打开。
  3. 运行conda create --name myenv python=3.10
  4. 运行conda activate myenv
  5. 运行pip install grpcio

这样就可以在第1步中使用Homebrew正确地安装arm64 conda环境,因此后续步骤可行。


0
以下是我使用的设置,
使用 https://asdf-vm.com/ 安装和管理我的 Python
使用 https://direnv.net 并创建 $PWD/.envrc 文件,只需一行代码
layout python

确保我使用 asdf 安装了最新的 Python 3.9

asdf plugin-add python 
asdf install python 3.9.15

然后执行,

direnv allow .

这将在$PWD/.direnv下创建一个Python虚拟环境,然后执行

pip install -U pip wheel grpcio

重要提示:除了 3.9.x 版本的 Python,其他版本可能无法正常工作,例如 3.10 版本可能会出现一些 clang 问题。


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