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

时间:2016-02-18 00:48:25

标签: python macos python-3.x osx-elcapitan pycrypto

我正在尝试在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

我尝试了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 pycryptosudo pip3 install pycrypto,但它们无效。 @ l'L'l帮助我通过做几件奇怪的,复杂的事情让我开始工作,这些东西虽然我自己也没有。它们在下面的答案中进行了总结。

2 个答案:

答案 0 :(得分:6)

概述:

手动构建您的尝试看起来可能会失败,因为它引用了您可能不具备的OS X 10.6 SDK,并且在大多数情况下已过时。此外,SDK现在存储在一个完全不同的位置,而不是10.6 SDK在其中的主要位置。

新SDK位置

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

旧SDK位置

/Developer/SDKs/

不存在/过时的SDK:

由于在尝试构建PyCrypto时,它似乎引用了MacOSX10.6.sdk,因此需要考虑以下几点:

  1. 为什么它引用了过时的SDK
  2. SDK的引用集
  3. 在哪里
  4. 如何纠正问题
  5. 除非我们仔细审核源代码,否则我们可能无法准确知道错误标志的设置位置,但我们可以尽力处理我们所拥有的信息。从错误中我们可以看到有几个实例会弹出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
    

    从来源构建:

    /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
    

    很明显,标题确实存在,因为测试工作正常。这告诉我们问题更可能直接与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
    

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

    $ 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 ..
    

    现在我们已经成功创建了符号链接,让我们再次尝试使用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
    
      

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

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

    $ xcrun --show-sdk-version
    10.11
    

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

    UPDATE:

    在进行一些重新调查之后,发现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
    

    我只能假设开发人员试图尽可能向后兼容,但不幸的是,它在这个过程中不断向前兼容。

    注意:

    使用 pip 安装Python软件包可以在很多方面(包管理,更新,卸载等)使生活变得更加轻松。例如,安装PyCrypto只需要发出命令:

    $ sudo pip install pycrypto
    

    如果你有multiple Python's,你可以使用版本号来相应地安装该Python:

    $ sudo pip3.5 install pycrypto
    

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

答案 1 :(得分:0)

当我运行pip install pycrypto时,我在OSX El Capitan上遇到了可能相关的问题。我看到了RuntimeError: autoconf error。我只需运行sudo xcodebuild -license并在查看许可协议后输入agree即可。之后我可以使用pip来安装pycrypto。