Установка криптографии на 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
cryptography
dependency) компилируется, но не удается во время выполнения, вызывая эту ошибку. Это должно быть исправлено путем передачи правильного пути в качестве аргумента компоновщика. Переустановить
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 шага помогли мне -
- Удаление старого cffi
pip uninstall cffi
- Обновление пункта
python -m pip install --upgrade pip
- Переустановка cffi
pip install cffi
- Установка криптографии
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 и больше нет проблем с ошибками компиляции и так далее.
Инструкции:
- Запустите iTerm2 (или приложение терминала по умолчанию) в Rosetta 2 (щелкните правой кнопкой мыши значок приложения -> ->).
- Установите homebrew как обычно
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
или вы можете получить эту ссылку на https://brew.sh/ по соображениям безопасности (никогда не копируйте команды curl из stackoverflow без двойной проверки). - Добавьте псевдоним в свой
~/.zshrc
(если вы используете ZSH) или~/.bash_profile
(если вы пользователь bash):alias brew='arch -x86_64 /usr/local/bin/brew'
. - Выключать
Open using rosetta
в iTerm2Get 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
Две версии добавляют некоторую гибкость при создании виртуальных сред проекта по мере необходимости. Например, вы можете создать виртуальную среду, используя:
-
/usr/local/bin/python3 -m venv venv
для архитектуры -x86_64 -
/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
И все стало работать без проблем.