Неустранимая ошибка при попытке установить PyCrypto в OS X El Capitan

Я пытаюсь установить PyCrypto на OS X 10.11.3 (El Capitan). Я использую Python 3.5.1. Я загрузил файл gzip из https://pypi.python.org/pypi/pycrypto и распаковал Это. Затем я выполнил python setup.py build, как сказано в инструкции, и, похоже, что-то сделал, а затем выдал такой результат:

/usr/bin/clang -fno-strict-aliasing -fno-common -dynamic -isysroot /Developer/SDKs/MacOSX10.6.sdk -arch i386 -arch x86_64 -fwrapv -Wall -Wstrict-prototypes -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c src/MD2.c -o build/temp.macosx-10.6-intel-2.7/src/MD2.o
src/MD2.c:30:10: fatal error: 'string.h' file not found
#include <string.h>
         ^
1 error generated.
error: command '/usr/bin/clang' failed with exit status 1

Я попробовал python3 setup.py build и получил очень похожий результат:

/usr/bin/clang -fno-strict-aliasing -Wsign-compare -Wunreachable-code -fno-common -dynamic -fwrapv -Wall -Wstrict-prototypes -arch i386 -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/Library/Frameworks/Python.framework/Versions/3.5/include/python3.5m -c src/MD2.c -o build/temp.macosx-10.6-intel-3.5/src/MD2.o
src/MD2.c:30:10: fatal error: 'string.h' file not found
#include <string.h>
         ^
1 error generated.
error: command '/usr/bin/clang' failed with exit status 1

Я попытался найти в Google что делать, но ничего полезного не нашел. Как я могу установить PyCrypto?

РЕДАКТИРОВАТЬ: Я также пробовал несколько других вещей, например pip install pycrypto и sudo pip3 install pycrypto, и они не работали. @ l'L'l помог мне заставить его работать, сделав несколько странных, сложных вещей, которых я никогда бы не сделал сам. Они кратко изложены в ответе ниже.


person Elias Zamaria    schedule 18.02.2016    source источник
comment
У вас установлен xcode или инструменты командной строки? Это необходимо для использования стандартных библиотек, llvm и т. Д.   -  person adarsh    schedule 18.02.2016
comment
У меня Xcode версии 7.2. Я попытался ввести make и gcc в терминал, как рекомендовано этим вопрос, чтобы проверить, установлены ли у меня инструменты командной строки XCode, и они сказали мне clang: error: no input files и make: *** No targets specified and no makefile found. Stop. соответственно, что означало бы, что я их установил. Я попытался запустить xcode-select -p; echo $?, и он сказал мне 0, что также должно означать, что они установлены.   -  person Elias Zamaria    schedule 18.02.2016
comment
Возможно, создание этой символической ссылки работает, если такая же проблема существует с OS X 10.11 и Xcode 7.x? gist.github.com/chrisyip/5b3cdb6a916f55354201#file-stdlib-h-md" rel="nofollow noreferrer"> gist.github.com/chrisyip/5b3cdb6a916f55354201#file-hibi мкр.   -  person adarsh    schedule 18.02.2016
comment
На самом деле у кого-то, похоже, была очень похожая проблема с решением stackoverflow.com/questions/13588518/   -  person adarsh    schedule 18.02.2016
comment
Я посмотрел на этот вопрос и побежал sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer /Developer, затем sudo ln -s /Developer/SDKs/MacOSX10.11.sdk MacOSX10.6.sdk. Я получаю ту же ошибку при запуске python3 setup.py build.   -  person Elias Zamaria    schedule 18.02.2016
comment
Вы проверяли ls -al /usr/include? Если что-то не так, попробуйте sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include /usr/include?   -  person adarsh    schedule 18.02.2016
comment
Я попробовал ls -al /usr/include и получил ls: /usr/include: No such file or directory. Я попробовал sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/S‌​DKs/MacOSX10.11.sdk/usr/include /usr/include, не ожидал, что это сработает, а просто хотел посмотреть, что произойдет, и он сказал мне ln: /usr/include: Operation not permitted.   -  person Elias Zamaria    schedule 18.02.2016
comment
Странно, что /usr/include не существует. У кого-то здесь, похоже, была аналогичная проблема, и она была решена с помощью xcode-select --install. Надеюсь, это сработает?   -  person adarsh    schedule 18.02.2016
comment
Я удалил добавленные символические ссылки, запустил xcode-select --install, затем запустил python3 setup.py build, и он сказал мне clang: error: unable to find utility "clang", not a developer tool or in PATH, затем error: command '/usr/bin/clang' failed with exit status 72.   -  person Elias Zamaria    schedule 18.02.2016
comment
Попробовать unset DYLD_LIBRARY_PATH?   -  person adarsh    schedule 18.02.2016
comment
Я попробовал echo $DYLD_LIBRARY_PATH и ничего не увидел, поэтому сомневаюсь, что его сброс что-то исправит. Но я попытался запустить unset DYLD_LIBRARY_PATH, затем python3 setup.py build и получил ту же ошибку clang: error: unable to find utility "clang", not a developer tool or in PATH.   -  person Elias Zamaria    schedule 18.02.2016
comment
Возможно, попробуйте это forum.developer.apple.com/thread/27453. Надеюсь, это сработает. Прошу прощения, что я не смог сильно помочь, и у меня сейчас нет идей: /   -  person adarsh    schedule 18.02.2016
comment
Я посмотрю на это, когда у меня будет возможность. По крайней мере, вы пытались мне помочь. Спасибо.   -  person Elias Zamaria    schedule 18.02.2016
comment
Я пытаюсь запустить Xcode, и он сразу дает сбой. Я вижу диалоговое окно, в котором говорится, что Xcode не открывается из-за проблемы. Появляется длинное сообщение об ошибке с участием Dyld Error Message. Я думаю, что я что-то напортачил, но не знаю что, и у меня еще не было возможности понять это. Если кто-то читает это, я бы рекомендовал не пробовать ничего из того, что упомянуто в этих комментариях.   -  person Elias Zamaria    schedule 18.02.2016
comment
Я удалил Xcode и повторно загрузил его. Теперь я снова могу запустить Xcode. Но я все еще не могу запустить python3 setup.py build без string.h ошибки.   -  person Elias Zamaria    schedule 20.02.2016
comment
Вы находитесь на 10.11.2019. Но консоль /Developer/SDKs/MacOSX10.6.sdk предполагает, что вы используете 10.6 sdk?   -  person skyline75489    schedule 21.02.2016
comment
@ skyline75489, я это заметил. Но я не знаю, что это значит и что я должен с этим делать. Я бегу python3 setup.py build. Я не знаю, почему он пытается использовать SDK 10.6. Кстати, я пробовал запустить ls /Developer/SDKs/ и увидел MacOSX10.5.sdk и MacOSX10.6.sdk и больше ничего.   -  person Elias Zamaria    schedule 21.02.2016
comment
Я тоже использую 10.11. И вот что, у меня даже /Developer/ нет! Какой результат xcode-select -p?   -  person skyline75489    schedule 21.02.2016
comment
Я побежал xcode-select -p и получил /Applications/Xcode.app/Contents/Developer.   -  person Elias Zamaria    schedule 21.02.2016
comment
Из моего чата с @ l'L'l кажется, что мои проблемы были вызваны неясной ошибкой в ​​PyCrypto. Но также кажется, что PyCrypto больше не поддерживается активно. Я нашел это: github.com/dlitz/pycrypto/issues/173   -  person Elias Zamaria    schedule 22.02.2016
comment
@EliasZamaria Да ... но все еще странно, что большинство людей, включая меня, могут без проблем установить его 10.11.   -  person skyline75489    schedule 22.02.2016
comment
@ skyline75489, согласен. Я думаю, что потратил на это так много времени, что мне неинтересно тратить еще больше времени на выяснение, почему это происходит. Думаю, я попробую другие криптографические модули, такие как PyCryptodome.   -  person Elias Zamaria    schedule 22.02.2016


Ответы (2)


Обзор:

Ручная сборка, которую вы пытаетесь выполнить, выглядит так, как будто она может дать сбой, потому что она ссылается на OS X 10.6 SDK, которого у вас, вероятно, нет, и по большей части устарел. Кроме того, SDK теперь хранятся в совершенно другом месте, чем когда SDK 10.6 был в расцвете сил.

Расположение нового SDK:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/

Расположение старых SDK:

/Developer/SDKs/

Несуществующий / устаревший SDK:

Поскольку кажется, что при попытке собрать PyCrypto он ссылается на MacOSX10.6.sdk, необходимо учитывать несколько вещей:

  1. Почему он ссылается на устаревший SDK
  2. Где находится SDK, на который он ссылается
  3. Что нужно сделать, чтобы исправить проблему

Если мы не проведем тщательный аудит исходного кода, мы можем не знать точно, где установлены неправильные флаги, но мы можем сделать все возможное, чтобы работать с имеющейся у нас информацией. Из ошибки видно, что в нескольких случаях всплывает имя SDK 10.6:

/usr/bin/clang -fno-strict-aliasing -fno-common -dynamic -isysroot /Developer/SDKs/MacOSX10.6.sdk -arch i386 -arch x86_64 -fwrapv -Wall -Wstrict-prototypes -std=c99 -O3 -fomit-frame-pointer -Isrc/ -I/Library

Построение из источника:

/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c src/MD2.c -o build/temp.macosx-10.6-intel-2.7/src/MD2.o
src/MD2.c:30:10: fatal error: 'string.h' file not found
#include <string.h>
                 ^
1 error generated.
error: command '/usr/bin/clang' failed with exit status 1

Анализируя это, мы видим, что файл PyCrypto MD2.c пытается быть построен с использованием флага -isysroot /Developer/SDKs/MacOSX10.6.sdk. Вместо этого, возможно, стоит попробовать pip:

Установка с помощью pip:

...
fatal error: 'string.h' file not found #include <string.h>
...

Та же ошибка; нам, вероятно, следует выяснить, существует ли заголовок <string.h> в системе - Давайте сделаем быстрый тест C приложения, чтобы выяснить:

Тестирование заголовков C:

$ echo "#include <string.h>
#include <stdio.h>
int main() { printf(\"TEST\n\"); return 0; }" > t.c
$ clang t.c -o t
$ ./t
TEST

Очевидно, что заголовок существует, потому что тест прошел нормально. Это говорит нам о том, что проблема, скорее всего, напрямую связана с SDK 10.6 (который, похоже, не существует в системе).

Символьные ссылки (несуществующие) из SDK 10.6 в SDK 10.11:

Поскольку мы не определили, где на самом деле устанавливается SDK, мы продолжим и попытаемся создать символические ссылки, чтобы любая ссылка на старый SDK 10.6 ссылалась на последний SDK (в настоящее время 10.11):

$ cd /Developer/SDKs
$ sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk MacOSX10.6.sdk

Мы можем проверить символическую ссылку, введя следующую команду:

$ ls -lat
total 8
drwxr-xr-x  3 root  wheel  102 Feb 21 15:54 .
lrwxr-xr-x  1 root  wheel   99 Feb 21 15:54 MacOSX10.6.sdk -> /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk
drwxr-xr-x  3 root  wheel  102 Feb 21 15:52 ..

Теперь, когда мы успешно создали символическую ссылку, давайте еще раз попробуем установить PyCrypto с помощью pip:

$ sudo pip install pycrypto
Collecting pycrypto
  Downloading pycrypto-2.6.1.tar.gz (446kB)
    100% |████████████████████████████████| 446kB 1.2GB/s 
Installing collected packages: pycrypto
  Running setup.py install for pycrypto ... done
Successfully installed pycrypto-2.6.1

Ошибок нет! Похоже, наша проблема решена! Ну, почти...

Нам все еще нужно выяснить, что отвечает за установку неправильного (10.6) SDK во время сборки. Давайте воспользуемся инструментом xcrun, чтобы посмотреть, какие значения установлены по умолчанию:

$ xcrun --show-sdk-version
10.11

Системный SDK по умолчанию установлен на 10.11, поэтому он должен быть неправильно установлен на 10.6 Python, PyCrypto или какой-либо другой аномалией, которую мы могли не учитывать.

ОБНОВИТЬ:

После некоторой разведки было обнаружено, что Python 3, похоже, построен с SDK для OS X 10.6. Кроме того, он также устанавливает SDK на 10.6 и устанавливает (устаревший) путь во многих местах Python_Framework. Здесь так много ссылок, что я не стану перечислять их все, хотя вот пример:

Python_Framework Folder/Versions/3.5/lib/python3.5/config-3.5m/Makefile:79:CONFIGURE_CFLAGS= -arch i386 -arch x86_64 -isysroot /Developer/SDKs/MacOSX10.6.sdk

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


Примечания:

Установка пакетов Python с помощью pip может значительно облегчить жизнь способов (управление пакетами, обновление, удаление и т. д.). Например, для установки PyCrypto достаточно ввести команду:

$ sudo pip install pycrypto

Если у вас есть несколько Python, вы можете использовать номер версии для установки для этого Python соответственно:

$ sudo pip3.5 install pycrypto

https://pip.pypa.io/en/stable/installing/

person l'L'l    schedule 21.02.2016
comment
Ох ... Я думал об использовании pip. Единственная причина, по которой я этого не сделал, заключается в том, что в документации, которую я нашел, об этом не упоминалось. В любом случае, я пробовал pip install pycrypto, sudo pip install pycrypto и sudo pip3.5 install pycrypto, и каждый раз получал одну и ту же ошибку fatal error: 'string.h' file not found. - person Elias Zamaria; 21.02.2016
comment
Попробуйте еще раз загрузить инструменты командной строки из Apple, а затем установите их: adcdownload.apple.com/Developer_Tools/. (для загрузки вам может потребоваться войти в систему). Если после этого что-то не работает, вероятно, проблема с путями все еще нуждается в решении. - person l'L'l; 21.02.2016
comment
Вы также можете установить через Xcode: developer.apple.com/library/prerelease/mac/recipes/ - person l'L'l; 21.02.2016
comment
@ I'L'l, первая ссылка сообщила мне, что эта страница больше не существует или Apple ID, с которым вы вошли, не имеет разрешения на просмотр этой страницы. - person Elias Zamaria; 21.02.2016
comment
@ I'L'l, я попробовал вторую ссылку, и всплывающее меню «Инструменты командной строки» дало мне только один выбор: XCode 7.2 (7C68). Под ним было написано /Applications/Xcode.app. Я попробовал опцию меню «Дополнительные инструменты разработчика ...» и увидел страницу с запросом моего Apple ID и пароля. Я вошел в систему, согласился с их соглашением с разработчиком и увидел загружаемый файл под названием Command Line Tools OS X 10.11 for Xcode 7.2.dmg. Я загрузил его, установил, запустил sudo pip3.5 install pycrypto и получил ту же ошибку string.h. То же самое для pip install pycrypto. - person Elias Zamaria; 21.02.2016
comment
Я запустил xcrun --show-sdk-version и получил следующий результат: dyld: Библиотека не загружена: @ rpath / XCTest.framework / Versions / A / XCTest Ссылка на: /Applications/Xcode.app/Contents/Frameworks/IDEFoundation.framework/Versions/A/IDEFoundation Reason : изображение не найдено xcrun: ошибка: невозможно найти элемент «SDKVersion» в SDK «/» - person Elias Zamaria; 22.02.2016
comment
Кроме того, теперь я не могу запустить git. Если я наберу git в командной строке, я увижу следующее: sh: line 1: 72906 Trace / BPT trap: 5 /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -sdk / -find git 2 ›/ dev / null git: ошибка: невозможно найти утилиту git, а не инструмент разработчика или в PATH Я не знаю наверняка, связано ли это с тем, что мы сделали с XCode, но могу поклясться, что помню, как git работал несколько недель назад, а может быть, и позже. Я бы заметил, что он сломан. - person Elias Zamaria; 22.02.2016
comment
У вас определенно есть компоненты Xcode / System, которые, по-видимому, полностью пропали (я думаю, что это в основном связано с Xcode). Я бы порекомендовал полностью удалить Xcode и заново загрузить его. Мы ничего не меняли в вашем PATH, поэтому проблемы, о которых вы говорите, вероятно, вызваны той же проблемой, которая могла удалить всю папку разработчика из Xcode.app. Если у вас по-прежнему возникают проблемы, возможно, стоит подумать о переустановке ОС, чтобы вернуть все, что таинственным образом отсутствует. - person l'L'l; 22.02.2016
comment
Я собираюсь удалить, повторно загрузить и переустановить XCode. Переустановка ОС звучит как PITA, поэтому я, вероятно, не буду этого делать, если только что-то действительно не испортилось так, как я не могу обойтись. - person Elias Zamaria; 22.02.2016
comment
Я переустановил XCode и теперь снова могу запускать git. - person Elias Zamaria; 22.02.2016
comment
Спасибо!! Мне пришлось удалить / переименовать существующий MacOSX10.6.sdk, чтобы он заработал. Проверка связи с ls -lat была для меня ключевым моментом. Спасибо за отличные инструкции! - person Heather Piwowar; 01.10.2019

У меня была проблема, которая могла быть связана с OSX El Capitan, когда я запускал pip install pycrypto. Я видел RuntimeError: autoconf error. Все, что мне нужно было сделать, это запустить sudo xcodebuild -license и набрать agree после ознакомления с лицензионным соглашением. После этого я смог использовать pip для установки pycrypto.

person jfunk    schedule 30.04.2016