尝试在OS X El Capitan上安装PyCrypto时出现致命错误

Eli*_*ria 7 python macos pycrypto python-3.x osx-elcapitan

我正在尝试在OS X 10.11.3(El Capitan)上安装PyCrypto.我使用的是Python 3.5.1.我从https://pypi.python.org/pypi/pycrypto下载了gzip文件并对其进行了解压缩.然后我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
Run Code Online (Sandbox Code Playgroud)

我尝试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
Run Code Online (Sandbox Code Playgroud)

我试着谷歌去弄清楚要做什么,但我找不到任何有用的东西.我该如何安装PyCrypto?

编辑:我也尝试过其他几个类似的事情pip install pycryptosudo pip3 install pycrypto他们没有工作.@ l'L'l帮助我通过做几件奇怪的,复杂的事情让我开始工作,这些东西虽然我自己也没有.它们总结在下面的答案中.

l'L*_*L'l 7

概述:

您正在尝试的手动构建看起来可能会失败,因为它引用了您可能没有的OS X 10.6 SDK,并且在很大程度上已经过时了.此外,SDK现在存储在与10.6 SDK处于最佳状态时完全不同的位置.

新SDK位置:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
Run Code Online (Sandbox Code Playgroud)

旧SDK位置:

/Developer/SDKs/
Run Code Online (Sandbox Code Playgroud)

不存在/过时的SDK:

因为看起来在尝试构建PyCrypto时它引用了MacOSX10.6.sdk几件事情需要考虑:

  1. 为什么它引用了过时的SDK
  2. 它引用的SDK在哪里设置
  3. 应该怎么做才能纠正这个问题

除非我们仔细审核源代码,否则我们可能无法准确知道错误标志的设置位置,但我们可以尽力处理我们所拥有的信息.从错误中我们可以看到有几个实例会弹出10.6 SDK的名称:

/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
Run Code Online (Sandbox Code Playgroud)

从源头构建:

/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
Run Code Online (Sandbox Code Playgroud)

通过分析,我们可以看到PyCrypto的MD2.c文件正在尝试使用该标志构建-isysroot /Developer/SDKs/MacOSX10.6.sdk.可能值得尝试pip:

用pip安装:

...
fatal error: 'string.h' file not found #include <string.h>
...
Run Code Online (Sandbox Code Playgroud)

同样的错误; 我们应该知道<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
Run Code Online (Sandbox Code Playgroud)

很明显,标题确实存在,因为测试工作正常.这告诉我们问题更可能直接与10.6 SDK相关(系统上似乎不存在).

符号化(不存在)10.6 SDK到10.11 SDK:

由于我们尚未确定SDK实际设置的位置,因此我们将继续尝试创建符号链接,以便旧的10.6 SDK的任何引用链接到最新的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
Run Code Online (Sandbox Code Playgroud)

我们可以通过发出以下命令来验证符号链接:

$ 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 ..
Run Code Online (Sandbox Code Playgroud)

现在我们已经成功创建了符号链接,让我们再次尝试使用pip安装PyCrypto:

$ 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
Run Code Online (Sandbox Code Playgroud)

没错!看起来我们的问题已经解决了!好吧,差不多......

我们仍然需要弄清楚在构建期间设置错误(10.6)SDK的原因.让我们使用该xcrun工具查看默认设置:

$ xcrun --show-sdk-version
10.11
Run Code Online (Sandbox Code Playgroud)

系统默认SDK设置为10.11,因此必须通过Python,PyCrypto或我们可能未考虑的其他一些异常将其设置为10.6.

更新:

在进行一些重新调查之后,发现Python 3似乎是使用OS X 10.6 SDK构建的.此外,它还将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
Run Code Online (Sandbox Code Playgroud)

我只能假设开发人员试图尽可能向后兼容,但不幸的是,它在这个过程中突破了兼容性.


笔记:

安装Python包pip可以在很多方面使包容管理,更新,卸载等生活更轻松.例如,安装PyCrypto只需要发出命令:

$ sudo pip install pycrypto
Run Code Online (Sandbox Code Playgroud)

如果您有多个Python,则可以使用版本号为该Python安装:

$ sudo pip3.5 install pycrypto
Run Code Online (Sandbox Code Playgroud)

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