在 Apple Silicon M1 上安装加密 Mac
Installing Cryptography on an Apple Silicon M1 Mac
求助!我正在尝试在我的 m1 上安装密码学。我知道我可以 运行 终端在罗塞塔模式下,但我想知道是否有办法不这样做。
输出:
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
我已经尝试构建 运行 就像他们在该代码块中的说明一样,但出现了同样的错误。我环顾四周,似乎还没有人找到解决办法,但这些东西通常都是两个月大的。我错过了什么?
此问题是由于 libffi header 版本与动态链接器找到的 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
是 up-to-date,则不再需要以下编译。但是,如果出于某种原因你想自己编译它:
LDFLAGS="-L$(brew --prefix openssl@1.1)/lib" CFLAGS="-I$(brew --prefix openssl@1.1)/include" pip install cryptography
您可能会遇到更多软件包的问题,并且每个软件包都有自己的 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/ 获取此 link(切勿在未仔细检查的情况下从 Whosebug 复制 curl 命令)。
- 在您的
~/.zshrc
(如果您使用的是 ZSH)或 ~/.bash_profile
(如果您是 bash 用户)中添加别名:alias brew='arch -x86_64 /usr/local/bin/brew'
.
- 在 iTerm2
Get info
中关闭 Open using rosetta
。
现在,每次您在终端应用程序中打印 brew
时,您都会 运行 x86_x64 Homebrew。当您从 brew
安装任何软件包时,它会自动在 Rosetta 2 下运行。
我之前无法安装 cffi,直到我发现了一个不相关的问题。我在这里待了大约两天,直到找到这个命令:
python3 -m ensurepip --upgrade
神奇的是,一切都开始为我工作。它来自 Python 和来自不同来源的 Pip 之间的问题。
这个问题的答案被盗:
编辑:这可能是上述海报的礼貌,因此可能无关。如果是这样,谢谢匿名人士!
作为上述答案的扩展,我继续将步骤 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 架构
我使用的是 Macbook Pro M1 2020 机型,遇到了同样的问题。问题可能只与我的 cffi 和 pip 版本有关。因为这 4 个步骤帮助了我 -
- 正在卸载旧的 cffi
pip uninstall cffi
- 升级 pip
python -m pip install --upgrade pip
- 正在重新安装 cffi
pip install cffi
- 正在安装密码
pip install cryptography
晚会有点晚了,但上面的解决方案对我不起作用。 Paul 让我走上了正确的轨道,但我的问题是 pyenv 使用 mac libffi 进行构建,而 cffi 使用自制版本。我在某处读到这篇文章,不能说这是独特的见解。
我的解决方案是确保我的 python (3.8.13) 是由 pyenv 使用自制软件 libffi 构建的,方法是确保正确的 headers 库和包配置:
export LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib -L$(brew --prefix openssl@1.1)/lib -L$(brew --prefix libffi)/lib"
export CPPFLAGS="-I$(brew --prefix zlib)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix openssl@1.1)/include -I$(brew --prefix libffi)/include"
export PKG_CONFIG_PATH="$(brew --prefix openssl@1.1)/lib/pkgconfig:$(brew --prefix libffi)/lib/pkgconfig"
重建python...
pyenv uninstall 3.8.13
pyenv install 3.8.13
杀死 pip 缓存
pip cache purge
最后,使用 pipenv
重新安装我的依赖项
pipenv --rm
pipenv sync --dev
经过这些步骤,我从可怕的事情中解脱出来了
ImportError: dlopen(/private/var/folders/k7/z3mq67_532bdr_rcm2grml240000gn/T/pip-build-env-apk5b25z/overlay/lib/python3.8/site-packages/_cffi_backend.cpython-38-darwin.so, 0x0002): symbol not found in flat namespace '_ffi_prep_closure'
求助!我正在尝试在我的 m1 上安装密码学。我知道我可以 运行 终端在罗塞塔模式下,但我想知道是否有办法不这样做。
输出:
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
我已经尝试构建 运行 就像他们在该代码块中的说明一样,但出现了同样的错误。我环顾四周,似乎还没有人找到解决办法,但这些东西通常都是两个月大的。我错过了什么?
此问题是由于 libffi header 版本与动态链接器找到的 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
是 up-to-date,则不再需要以下编译。但是,如果出于某种原因你想自己编译它:
LDFLAGS="-L$(brew --prefix openssl@1.1)/lib" CFLAGS="-I$(brew --prefix openssl@1.1)/include" pip install cryptography
您可能会遇到更多软件包的问题,并且每个软件包都有自己的 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/ 获取此 link(切勿在未仔细检查的情况下从 Whosebug 复制 curl 命令)。 - 在您的
~/.zshrc
(如果您使用的是 ZSH)或~/.bash_profile
(如果您是 bash 用户)中添加别名:alias brew='arch -x86_64 /usr/local/bin/brew'
. - 在 iTerm2
Get info
中关闭Open using rosetta
。
现在,每次您在终端应用程序中打印 brew
时,您都会 运行 x86_x64 Homebrew。当您从 brew
安装任何软件包时,它会自动在 Rosetta 2 下运行。
我之前无法安装 cffi,直到我发现了一个不相关的问题。我在这里待了大约两天,直到找到这个命令:
python3 -m ensurepip --upgrade
神奇的是,一切都开始为我工作。它来自 Python 和来自不同来源的 Pip 之间的问题。
这个问题的答案被盗:
编辑:这可能是上述海报的礼貌,因此可能无关。如果是这样,谢谢匿名人士!
作为上述答案的扩展,我继续将步骤 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 架构
我使用的是 Macbook Pro M1 2020 机型,遇到了同样的问题。问题可能只与我的 cffi 和 pip 版本有关。因为这 4 个步骤帮助了我 -
- 正在卸载旧的 cffi
pip uninstall cffi
- 升级 pip
python -m pip install --upgrade pip
- 正在重新安装 cffi
pip install cffi
- 正在安装密码
pip install cryptography
晚会有点晚了,但上面的解决方案对我不起作用。 Paul 让我走上了正确的轨道,但我的问题是 pyenv 使用 mac libffi 进行构建,而 cffi 使用自制版本。我在某处读到这篇文章,不能说这是独特的见解。
我的解决方案是确保我的 python (3.8.13) 是由 pyenv 使用自制软件 libffi 构建的,方法是确保正确的 headers 库和包配置:
export LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix bzip2)/lib -L$(brew --prefix openssl@1.1)/lib -L$(brew --prefix libffi)/lib"
export CPPFLAGS="-I$(brew --prefix zlib)/include -I$(brew --prefix bzip2)/include -I$(brew --prefix openssl@1.1)/include -I$(brew --prefix libffi)/include"
export PKG_CONFIG_PATH="$(brew --prefix openssl@1.1)/lib/pkgconfig:$(brew --prefix libffi)/lib/pkgconfig"
重建python...
pyenv uninstall 3.8.13
pyenv install 3.8.13
杀死 pip 缓存
pip cache purge
最后,使用 pipenv
重新安装我的依赖项pipenv --rm
pipenv sync --dev
经过这些步骤,我从可怕的事情中解脱出来了
ImportError: dlopen(/private/var/folders/k7/z3mq67_532bdr_rcm2grml240000gn/T/pip-build-env-apk5b25z/overlay/lib/python3.8/site-packages/_cffi_backend.cpython-38-darwin.so, 0x0002): symbol not found in flat namespace '_ffi_prep_closure'