在 Apple Silicon M1 Mac 上安装 Cryptography
Posted
技术标签:
【中文标题】在 Apple Silicon M1 Mac 上安装 Cryptography【英文标题】:Installing Cryptography on an Apple Silicon M1 Mac 【发布时间】:2021-05-08 03:02:03 【问题描述】:帮助!我正在尝试在我的 m1 上安装密码学。我知道我可以在 Rosetta 模式下运行终端,但我想知道是否有办法不这样做。
输出:
ERROR: Command errored out with exit status 1:
command: /opt/homebrew/opt/python@3.9/bin/python3.9 /opt/homebrew/lib/python3.9/site-packages/pip/_vendor/pep517/_in_process.py prepare_metadata_for_build_wheel /var/folders/hj/5zfkv68d7lqgrfqt046bn23c0000gn/T/tmpl4sga84k
cwd: /private/var/folders/hj/5zfkv68d7lqgrfqt046bn23c0000gn/T/pip-install-jko4b562/cryptography_7b1bbc9ece2f481a8e8e9ea03b1a0030
Complete output (55 lines):
=============================DEBUG ASSISTANCE=============================
If you are seeing a compilation error please try the following steps to
successfully install cryptography:
1) Upgrade to the latest pip and try again. This will fix errors for most
users. See: https://pip.pypa.io/en/stable/installing/#upgrading-pip
2) Read https://cryptography.io/en/latest/installation.html for specific
instructions for your platform.
3) Check our frequently asked questions for more information:
https://cryptography.io/en/latest/faq.html
=============================DEBUG ASSISTANCE=============================
Traceback (most recent call last):
File "/opt/homebrew/lib/python3.9/site-packages/pip/_vendor/pep517/_in_process.py", line 280, in <module>
main()
File "/opt/homebrew/lib/python3.9/site-packages/pip/_vendor/pep517/_in_process.py", line 263, in main
json_out['return_val'] = hook(**hook_input['kwargs'])
File "/opt/homebrew/lib/python3.9/site-packages/pip/_vendor/pep517/_in_process.py", line 133, in prepare_metadata_for_build_wheel
return hook(metadata_directory, config_settings)
File "/private/var/folders/hj/5zfkv68d7lqgrfqt046bn23c0000gn/T/pip-build-env-9bqzge_f/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 161, in prepare_metadata_for_build_wheel
self.run_setup()
File "/private/var/folders/hj/5zfkv68d7lqgrfqt046bn23c0000gn/T/pip-build-env-9bqzge_f/overlay/lib/python3.9/site-packages/setuptools/build_meta.py", line 145, in run_setup
exec(compile(code, __file__, 'exec'), locals())
File "setup.py", line 44, in <module>
setup(
File "/private/var/folders/hj/5zfkv68d7lqgrfqt046bn23c0000gn/T/pip-build-env-9bqzge_f/overlay/lib/python3.9/site-packages/setuptools/__init__.py", line 153, in setup
return distutils.core.setup(**attrs)
File "/opt/homebrew/Cellar/python@3.9/3.9.1_7/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/core.py", line 108, in setup
_setup_distribution = dist = klass(attrs)
File "/private/var/folders/hj/5zfkv68d7lqgrfqt046bn23c0000gn/T/pip-build-env-9bqzge_f/overlay/lib/python3.9/site-packages/setuptools/dist.py", line 432, in __init__
_Distribution.__init__(self,
File "/opt/homebrew/Cellar/python@3.9/3.9.1_7/Frameworks/Python.framework/Versions/3.9/lib/python3.9/distutils/dist.py", line 292, in __init__
self.finalize_options()
File "/private/var/folders/hj/5zfkv68d7lqgrfqt046bn23c0000gn/T/pip-build-env-9bqzge_f/overlay/lib/python3.9/site-packages/setuptools/dist.py", line 708, in finalize_options
ep(self)
File "/private/var/folders/hj/5zfkv68d7lqgrfqt046bn23c0000gn/T/pip-build-env-9bqzge_f/overlay/lib/python3.9/site-packages/setuptools/dist.py", line 715, in _finalize_setup_keywords
ep.load()(self, ep.name, value)
File "/private/var/folders/hj/5zfkv68d7lqgrfqt046bn23c0000gn/T/pip-build-env-9bqzge_f/overlay/lib/python3.9/site-packages/cffi/setuptools_ext.py", line 219, in cffi_modules
add_cffi_module(dist, cffi_module)
File "/private/var/folders/hj/5zfkv68d7lqgrfqt046bn23c0000gn/T/pip-build-env-9bqzge_f/overlay/lib/python3.9/site-packages/cffi/setuptools_ext.py", line 49, in add_cffi_module
execfile(build_file_name, mod_vars)
File "/private/var/folders/hj/5zfkv68d7lqgrfqt046bn23c0000gn/T/pip-build-env-9bqzge_f/overlay/lib/python3.9/site-packages/cffi/setuptools_ext.py", line 25, in execfile
exec(code, glob, glob)
File "src/_cffi_src/build_openssl.py", line 77, in <module>
ffi = build_ffi_for_binding(
File "src/_cffi_src/utils.py", line 54, in build_ffi_for_binding
ffi = build_ffi(
File "src/_cffi_src/utils.py", line 74, in build_ffi
ffi = FFI()
File "/private/var/folders/hj/5zfkv68d7lqgrfqt046bn23c0000gn/T/pip-build-env-9bqzge_f/overlay/lib/python3.9/site-packages/cffi/api.py", line 48, in __init__
import _cffi_backend as backend
ImportError: dlopen(/private/var/folders/hj/5zfkv68d7lqgrfqt046bn23c0000gn/T/pip-build-env-9bqzge_f/overlay/lib/python3.9/site-packages/_cffi_backend.cpython-39-darwin.so, 2): Symbol not found: _ffi_prep_closure
Referenced from: /private/var/folders/hj/5zfkv68d7lqgrfqt046bn23c0000gn/T/pip-build-env-9bqzge_f/overlay/lib/python3.9/site-packages/_cffi_backend.cpython-39-darwin.so
Expected in: flat namespace
in /private/var/folders/hj/5zfkv68d7lqgrfqt046bn23c0000gn/T/pip-build-env-9bqzge_f/overlay/lib/python3.9/site-packages/_cffi_backend.cpython-39-darwin.so
我尝试按照他们在该代码块中的说明构建和运行相同的错误。我环顾四周,似乎还没有人找到解决办法,但这些东西通常是两个月大的。我错过了什么?
【问题讨论】:
【参考方案1】:我使用的是 Macbook Pro M1 2020 型号,遇到了同样的问题。问题可能仅与我的 cffi 和 pip 版本有关。因为这 4 个步骤帮助了我 -
-
卸载旧的 cffi
pip uninstall cffi
升级点子python -m pip install --upgrade pip
重新安装 cffi pip install cffi
安装密码pip install cryptography
【讨论】:
【参考方案2】:This answer here worked like a charm! @paveldroo
作为上述答案的扩展,我继续在步骤 3 中将别名保存为 alias ibrew='arch -x86_64 /usr/local/bin/brew'
~/.zshrc
这意味着当我使用brew
命令安装任何东西时,它会被安装为 M1 架构,而当我使用 ibrew
命令安装时,它会被安装为 -x86_64 架构。
因此,我在我的系统上安装了两个 python3 实例,一个在 /opt/homebrew/bin/python3
使用 brew
,另一个在 /usr/local/bin/python3
使用 ibrew
这两个版本在根据需要创建项目虚拟环境时增加了一些灵活性。例如,您可以使用以下方法创建虚拟环境:
/usr/local/bin/python3 -m venv venv
用于 -x86_64 架构
/opt/homebrew/bin/python3 -m venv venv
适用于 M1 架构
【讨论】:
【参考方案3】:我之前无法安装 cffi,直到我发现了一个不相关的问题。我在这里待了大约两天,直到我找到了这个命令:
python3 -m ensurepip --upgrade
神奇的是,一切都开始为我工作了。它来自不同来源的 Python 和 Pip 之间的问题。
这个问题的答案被盗:using pip3: module "importlib._bootstrap" has no attribute "SourceFileLoader"
编辑:这可能是上述海报的礼貌,因此可能无关。如果是这样,谢谢你匿名的人!
【讨论】:
【参考方案4】:你可能会遇到更多包的问题,并且每个包都有自己的 Apple Silicon 解决方案,这很累。
我得出了最终解决方案:使用 x86_x64 Homebrew 来安装 x86 包,包括 Python。因此,您的所有要求都像在 x86_x64 mac 上一样安装,并且不会再出现编译错误等问题。
说明:
-
在 Rosetta 2 下运行 iTerm2(或默认终端应用程序)(右键单击应用程序图标 ->
Get info
-> Open using rosetta
)。
照常安装自制软件/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
,或者出于安全原因,您可以从https://brew.sh/ 获取此链接(切勿在没有仔细检查的情况下从*** 复制curl 命令)。
在 ~/.zshrc
(如果您使用 ZSH)或 ~/.bash_profile
(如果您是 bash 用户)中添加别名:alias brew='arch -x86_64 /usr/local/bin/brew'
。
在 iTerm2 中关闭 Open using rosetta
Get info
。
现在,每次您在终端应用程序中打印 brew
时,您都会运行 x86_x64 Homebrew。当您从brew
安装任何软件包时,它会自动在 Rosetta 2 下运行。
【讨论】:
还没到这个,但谢谢!这太疯狂了。我购买了一台 MacMini M1,完全打算将其用作构建服务器。哎呀!真是一团糟。【参考方案5】:此问题是由于 libffi 标头版本与动态链接器找到的 libffi 版本不匹配造成的。一般来说,遇到此问题的用户似乎安装了自制 libffi,并以某种方式针对该问题构建了 Python。
当发生这种情况时,cffi
(cryptography
依赖项)编译,但在运行时失败并引发此错误。这应该可以通过将正确的路径作为链接器参数传递来解决。要重新安装cffi
,您应该在pip uninstall cffi
后跟
LDFLAGS=-L$(brew --prefix libffi)/lib CFLAGS=-I$(brew --prefix libffi)/include pip install cffi --no-binary :all:
这是一个丑陋的解决方法,但现在可以让你克服这个障碍。
更新:我已经为 macOS 上传了 arm64 ***,因此如果您的 pip
是最新的,则不再需要以下编译。但是,如果出于某种原因您希望自己编译它:
LDFLAGS="-L$(brew --prefix openssl@1.1)/lib" CFLAGS="-I$(brew --prefix openssl@1.1)/include" pip install cryptography
【讨论】:
谢谢,在别处找到了这个,但这绝对是正确的答案。 当我运行pip uninstall cffi
时,它只是告诉我没有安装包。但我得到了上面的确切错误。
即使我安装了最新的 pip,更新也无法正常工作。第一个解决方法仍然有效。谢谢你
更新的信息是针对 cryptography
包的,它有更多的构建要求。主要说明用于解决 cffi
问题,该问题(截至 2021 年 6 月)不提供 macOS arm64 轮。一旦你有了它,那么cryptography
轮将工作并简化你的安装。
我的 M1 Mac 的内置 python 上的密码学无法正常工作。例如,织物不适用于它。我能够从 Nix 包管理器(我可以找到 M1 Mac 的 python2 包的唯一地方)获得一个用于 arm 的 python2,并从那里安装了一个有效的密码学。见***.com/questions/68293059/…以上是关于在 Apple Silicon M1 Mac 上安装 Cryptography的主要内容,如果未能解决你的问题,请参考以下文章
在具有 M1 芯片(基于 ARM 的 Apple Silicon)的 Mac 上安装较早版本的 Python(3.8 之前)失败
Mac Apple Silicon M1/M2 homebrew miniforge conda pytorch yolov5深度学习环境搭建并简单测试MPS GPU加速
如何在 Apple Silicon (ARM / M1) 上安装 SciPy