Установка криптографии на 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

Я пытался собрать и запустить, как говорится в их инструкциях в этом блоке кода, к той же ошибке. Я осмотрелся, и, похоже, никто еще не нашел исправления, но обычно этим вещам два месяца. Что мне не хватает?

9 ответов

Решение

Эта проблема возникает из-за несоответствия между версией заголовка libffi и версией libffi, которую обнаруживает динамический компоновщик. В общем, похоже, что пользователи, сталкивающиеся с этой проблемой, установили homebrew libffi и каким-то образом построили Python для этого.

Когда это произойдет (a cryptographydependency) компилируется, но не удается во время выполнения, вызывая эту ошибку. Это должно быть исправлено путем передачи правильного пути в качестве аргумента компоновщика. Переустановить cffi вам следует pip uninstall cffi с последующим

LDFLAGS=-L$(brew --prefix libffi)/lib CFLAGS=-I$(brew --prefix libffi)/include pip install cffi --no-binary :all:

Затем вы сможете скомпилировать криптографию, используя

LDFLAGS="-L$(brew --prefix openssl@1.1)/lib" CFLAGS="-I$(brew --prefix openssl@1.1)/include" pip install cryptography

Это уродливый обходной путь, но пока он поможет вам преодолеть это препятствие.

Я использую модель Macbook Pro M1 2020 и столкнулся с той же проблемой. Проблема была только с моими версиями cffi и pip. Потому что эти 4 шага помогли мне -

  1. Удаление старого cffi pip uninstall cffi
  2. Обновление пункта python -m pip install --upgrade pip
  3. Переустановка cffi pip install cffi
  4. Установка криптографии pip install cryptography

Немного опоздал на вечеринку, но приведенные выше решения не сработали для меня. Пол наставил меня на правильный путь, но моя проблема заключалась в том, что pyenv использовала mac libffi для своей сборки, а cffi использовала доморощенную версию. Я читал это где-то, не могу претендовать на это уникальное понимание.

Мое решение состояло в том, чтобы убедиться, что мой python (3.8.13) был собран pyenv с использованием доморощенной libffi, обеспечив правильные библиотеки заголовков и конфигурацию пакета:

      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"

восстановление питона...

      pyenv uninstall 3.8.13
pyenv install 3.8.13

убиваем кеш пипсов

      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'

Возможно, у вас возникнут проблемы с большим количеством пакетов, и у каждого из них есть свое решение для Apple Silicon, это утомительно.

Я пришел к окончательному решению: использовал x86_x64 Homebrew, который устанавливает пакеты x86, включая Python. Таким образом, все ваши требования устанавливаются как на Mac x86_x64 и больше нет проблем с ошибками компиляции и так далее.

Инструкции:

  1. Запустите iTerm2 (или приложение терминала по умолчанию) в Rosetta 2 (щелкните правой кнопкой мыши значок приложения -> ->).
  2. Установите homebrew как обычно /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"или вы можете получить эту ссылку на https://brew.sh/ по соображениям безопасности (никогда не копируйте команды curl из stackoverflow без двойной проверки).
  3. Добавьте псевдоним в свой ~/.zshrc (если вы используете ZSH) или ~/.bash_profile (если вы пользователь bash): alias brew='arch -x86_64 /usr/local/bin/brew'.
  4. Выключать Open using rosetta в iTerm2 Get info.

Теперь каждый раз, когда вы будете печатать в терминальных приложениях, вы будете запускать x86_x64 Homebrew. И при установке любого пакета из brew, он будет работать под Rosetta 2 автоматически.

Я удалил старую версиюcffiиcryptography,

      pip uninstall cffi
pip uninstall cryptography

и обновилrequirements.txtфайл из точных версий в обновленные версии

      # requirements.txt

cffi>=1.15.1 
cryptography>=38.0.1

(номер версии может быть другим). Это решило мою проблему

Этот ответ здесь сработал как шарм! @paveldroo

В качестве дополнения к ответу выше я сохранил псевдоним на шаге 3 как alias ibrew='arch -x86_64 /usr/local/bin/brew'в ~/.zshrc

Это означает, что когда я устанавливаю что-либо с помощью команды, оно устанавливается для архитектуры M1, а когда я устанавливаю с помощью команды, оно устанавливается для архитектуры -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для архитектуры М1

Мне не удавалось ранее установить cffi, пока я не обнаружил несвязанную проблему. Я занимался этим около двух дней, пока не нашел эту команду:

      python3 -m ensurepip --upgrade

Волшебным образом у меня все заработало. Это произошло из-за проблемы между Python и Pip из разных источников.

Ответ украден из этого вопроса: при использовании pip3: модуль "importlib._bootstrap" не имеет атрибута "SourceFileLoader"

Изменить: это может быть любезно предоставлено вышеуказанным плакатом, поэтому может не иметь отношения. Если да, то спасибо анонимному человеку!

Я исправил свою проблему, используяintel64версия питона. Поэтому я установил Python с помощью установщика 64-битной версии Universal2 для MacOS с веб-сайта Python .

Тогда мне просто нужно было создать виртуальную среду, например:python3.11-intel64файл из/usr/local/bin/и установил все пакеты с этой версией:

      $ venv/bin/python-intel64 -m pip install -r requirements.txt

И все стало работать без проблем.

Хм. У меня не работает :( Получите все те же результаты.

Другие вопросы по тегам