【问题标题】:Error installing bcrypt with pip on OS X: can't find ffi.h (libffi is installed)在 OS X 上使用 pip 安装 bcrypt 时出错:找不到 ffi.h(已安装 libffi)
【发布时间】:2014-05-17 12:04:45
【问题描述】:

我在尝试使用 pip 安装 bcrypt 时遇到此错误。我在几个地方(Xcode OS X SDK 和自制软件)安装了 libffi,但我不知道如何告诉 pip 去寻找它。有什么建议吗?

Downloading/unpacking bcrypt==1.0.2 (from -r requirements.txt (line 41))
  Running setup.py egg_info for package bcrypt
    OS/X: confusion between 'cc' versus 'gcc' (see issue 123)
    will not use '__thread' in the C code
    c/_cffi_backend.c:14:10: fatal error: 'ffi.h' file not found
    #include <ffi.h>
             ^
    1 error generated.
    Traceback (most recent call last):
      File "<string>", line 16, in <module>
      File "/Users/cody/virtualenvs/analytics/build/bcrypt/setup.py", line 104, in <module>
        "Programming Language :: Python :: 3.3",
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/core.py", line 112, in setup
        _setup_distribution = dist = klass(attrs)
      File "build/bdist.macosx-10.9-intel/egg/setuptools/dist.py", line 239, in __init__
      File "build/bdist.macosx-10.9-intel/egg/setuptools/dist.py", line 264, in fetch_build_eggs
      File "build/bdist.macosx-10.9-intel/egg/pkg_resources.py", line 620, in resolve
        dist = best[req.key] = env.best_match(req, ws, installer)
      File "build/bdist.macosx-10.9-intel/egg/pkg_resources.py", line 858, in best_match
        return self.obtain(req, installer) # try and download/install
      File "build/bdist.macosx-10.9-intel/egg/pkg_resources.py", line 870, in obtain
        return installer(requirement)
      File "build/bdist.macosx-10.9-intel/egg/setuptools/dist.py", line 314, in fetch_build_egg
      File "build/bdist.macosx-10.9-intel/egg/setuptools/command/easy_install.py", line 593, in easy_install

      File "build/bdist.macosx-10.9-intel/egg/setuptools/command/easy_install.py", line 623, in install_item

      File "build/bdist.macosx-10.9-intel/egg/setuptools/command/easy_install.py", line 811, in install_eggs

      File "build/bdist.macosx-10.9-intel/egg/setuptools/command/easy_install.py", line 1017, in build_and_install

      File "build/bdist.macosx-10.9-intel/egg/setuptools/command/easy_install.py", line 1005, in run_setup

    distutils.errors.DistutilsError: Setup script exited with error: command 'cc' failed with exit status 1
    Complete output from command python setup.py egg_info:
    OS/X: confusion between 'cc' versus 'gcc' (see issue 123)

will not use '__thread' in the C code

c/_cffi_backend.c:14:10: fatal error: 'ffi.h' file not found

#include <ffi.h>

         ^

1 error generated.

Traceback (most recent call last):

  File "<string>", line 16, in <module>

  File "/Users/cody/virtualenvs/analytics/build/bcrypt/setup.py", line 104, in <module>

    "Programming Language :: Python :: 3.3",

  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/core.py", line 112, in setup

    _setup_distribution = dist = klass(attrs)

  File "build/bdist.macosx-10.9-intel/egg/setuptools/dist.py", line 239, in __init__

  File "build/bdist.macosx-10.9-intel/egg/setuptools/dist.py", line 264, in fetch_build_eggs

  File "build/bdist.macosx-10.9-intel/egg/pkg_resources.py", line 620, in resolve

    dist = best[req.key] = env.best_match(req, ws, installer)

  File "build/bdist.macosx-10.9-intel/egg/pkg_resources.py", line 858, in best_match

    return self.obtain(req, installer) # try and download/install

  File "build/bdist.macosx-10.9-intel/egg/pkg_resources.py", line 870, in obtain

    return installer(requirement)

  File "build/bdist.macosx-10.9-intel/egg/setuptools/dist.py", line 314, in fetch_build_egg

  File "build/bdist.macosx-10.9-intel/egg/setuptools/command/easy_install.py", line 593, in easy_install



  File "build/bdist.macosx-10.9-intel/egg/setuptools/command/easy_install.py", line 623, in install_item



  File "build/bdist.macosx-10.9-intel/egg/setuptools/command/easy_install.py", line 811, in install_eggs



  File "build/bdist.macosx-10.9-intel/egg/setuptools/command/easy_install.py", line 1017, in build_and_install



  File "build/bdist.macosx-10.9-intel/egg/setuptools/command/easy_install.py", line 1005, in run_setup



distutils.errors.DistutilsError: Setup script exited with error: command 'cc' failed with exit status 1

----------------------------------------
Command python setup.py egg_info failed with error code 1 in /Users/cody/virtualenvs/analytics/build/bcrypt

【问题讨论】:

    标签: python macos pip bcrypt libffi


    【解决方案1】:

    theseposts 的帮助下,我终于可以使用以下功能了:

    brew install pkg-config libffi
    sudo bash
    export CFLAGS=-Qunused-arguments
    export CPPFLAGS=-Qunused-arguments
    export PKG_CONFIG_PATH=/usr/local/Cellar/libffi/3.0.13/lib/pkgconfig/
    pip install bcrypt
    

    【讨论】:

    • 这个答案没问题,但 CFLAGS 和 CPPFLAGS 未使用,因此无需设置它们。另外,不要使用 sudo 安装 pip 包。请参阅下面的答案。
    • 我怀疑这是因为更新版本的 pip 包中的修复使这些标志变得不必要。在我写答案的时候,只要按照你的答案中的步骤,我就会构建失败,但现在他们没有。我会将你的标记为已接受。
    【解决方案2】:

    不使用 sudo 和 CFLAGS 和 CPPFLAGS(pip 不需要):

    $ brew install pkg-config libffi
    $ export PKG_CONFIG_PATH=/usr/local/Cellar/libffi/3.0.13/lib/pkgconfig/
    $ pip install bcrypt
    

    【讨论】:

    • 你是一帆风顺的水手!
    • 我使用这个建议让sudo pip install cryptography 在 osx 上工作。谢谢!
    • 在没有设置 PKG_CONFIG_PATH 的情况下工作
    • 相信随着 bcrypt 2.0.0 的发布,不再需要设置环境变量了。
    • 现在安装的 pkgconfig 版本不同了 - 对我来说,在撰写本文时它是 3.2.1
    【解决方案3】:

    15 年 8 月 26 日更新

    我认为TA的回答更好,因为它是由系统处理的。


    首先,我讨厌安装 Brew 或 Ports,但这是另一个问题。

    我一直在尝试pip install cryptography,这取决于cffi,它导入ffi.h

    我很好奇为什么没有人提到他(和我,以及我相信其他人)安装了 Xcode 的 ffi

    locate ffi.h
    /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/ffi/ffi.h
    

    因为错误是专门关于“找不到”ffi.h 使用以下构建命令:

    c/_cffi_backend.c:14:10: fatal error: 'ffi.h' file not found
    #include <ffi.h>
    ...
    ...
    /usr/bin/clang ...{omitted}... I/usr/include/ffi -I/usr/include/libffi
    

    我有ffi.h,只是系统认为应该在/usr/include/...

    我的/usr/include 目录恰好是空的,并且没有链接到任何东西,所以我只是将有问题的目录/文件链接到了找不到它的地方:

    ln -fs {THAT_XCODE_SDK_FFI_PATH_FROM_ABOVE} /usr/include/ffi
    

    我现在可以安装和构建 cffi 和密码学了。

    在理解构建链/链接动态方面我非常新手,如果这不好,我不明白......所以,请告诉我。

    【讨论】:

      【解决方案4】:

      已经为我安装了 Xcode(正如问题本身所提到的,它确实提供了 ffi.h 标头),但由于某种原因,它没有填充 /usr/include(正如 Zachary Young 所提到的)。我四处寻找为什么没有填充 /usr/include 并发现以下命令修复了它:

      $ xcode-select --install
      

      Missing /usr/include after Yosemite and Xcode install?

      【讨论】:

      • 感谢您的发现,我觉得这比手动链接要好得多。
      猜你喜欢
      • 1970-01-01
      • 2015-10-09
      • 2015-12-06
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 2013-05-05
      相关资源
      最近更新 更多