在 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。

发生这种情况时 cfficryptography 依赖项)编译,但在运行时失败并引发此错误。这应该可以通过将正确的路径作为链接器参数传递来解决。要重新安装 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 上一样安装,并且不再有编译错误等问题。

说明:

  1. 运行 Rosetta 2 下的 iTerm2(或默认终端应用程序)(右键单击应用程序图标 -> Get info -> Open using rosetta)。
  2. 像往常一样安装自制软件 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 或者出于安全原因,您可以从 https://brew.sh/ 获取此 link(切勿在未仔细检查的情况下从 Whosebug 复制 curl 命令)。
  3. 在您的 ~/.zshrc(如果您使用的是 ZSH)或 ~/.bash_profile(如果您是 bash 用户)中添加别名:alias brew='arch -x86_64 /usr/local/bin/brew'.
  4. 在 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

这两个版本在根据需要创建项目虚拟环境方面增加了一些灵活性。例如,您可以使用以下方法创建虚拟环境:

  1. /usr/local/bin/python3 -m venv venv 用于 -x86_64 体系结构
  2. /opt/homebrew/bin/python3 -m venv venv M1 架构

我使用的是 Macbook Pro M1 2020 机型,遇到了同样的问题。问题可能只与我的 cffi 和 pip 版本有关。因为这 4 个步骤帮助了我 -

  1. 正在卸载旧的 cffi pip uninstall cffi
  2. 升级 pip python -m pip install --upgrade pip
  3. 正在重新安装 cffi pip install cffi
  4. 正在安装密码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'