Ошибка при установке bcrypt с pip в OS X: не удается найти ffi.h (установлена ​​libffi)

Я получаю эту ошибку при попытке установить bcrypt с помощью pip. У меня есть libffi, установленный в нескольких местах (Xcode OS X SDK и из доморощенного), но я не знаю, как сказать 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

person Cody    schedule 05.04.2014    source источник


Ответы (4)


Без использования 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
person nathancahill    schedule 15.09.2014
comment
Вы один гладкий матрос! - person SoundsSerious; 02.01.2015
comment
Я воспользовался этим советом, чтобы заставить sudo pip install cryptography работать на osx. Спасибо! - person ThinkBonobo; 19.07.2015
comment
Работает без установки PKG_CONFIG_PATH - person Mykel; 24.08.2015
comment
Я считаю, что с выпуском bcrypt 2.0.0 установка переменной среды больше не требуется. - person nathancahill; 24.08.2015
comment
Это помогло мне установить Quartz pip install pyobjc-framework-Quartz. Спасибо. - person Mohan Raj; 04.06.2016
comment
Версия установленного pkgconfig теперь отличается - для меня это была 3.2.1 на момент написания - person James Hiew; 21.10.2017


Xcode уже был установлен для меня (как упоминалось в самом вопросе, что он предоставляет заголовок ffi.h), но по какой-то причине он не заполнил /usr/include (как упомянул Закари Янг). Я копался, чтобы понять, почему /usr/include не был заполнен, и обнаружил, что это исправлено следующей командой:

$ xcode-select --install

Отсутствует /usr/include после установки Yosemite и Xcode?

person T A    schedule 26.05.2015
comment
Спасибо, что нашли это, я чувствую, что это намного лучше, чем связывание вручную. - person Zach Young; 26.08.2015

Обновление от 26 августа 2015 г.

Я думаю, что ответ ТА лучше, поскольку он обрабатывается системой.


Во-первых, я ненавижу устанавливать Brew или Ports, но это уже другая проблема.

Я пытался pip install cryptography, что зависит от cffi, который импортирует ffi.h.

Мне любопытно, почему никто не сообщил, что у него (и у меня, и, я думаю, у других) установлен ffi с Xcode:

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 и криптографию.

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

person Zach Young    schedule 17.03.2015