在 Mac OS X Mavericks 上安装 py-ldap(缺少 sasl.h)

33

我好像无法在我的OS X Mavericks 10.9.1机器上安装Python LDAP模块。

内核详情: uname -a Darwin 13.0.0 Darwin Kernel Version 13.0.0: Thu Sep 19 22:22:27 PDT 2013; root:xnu-2422.1.72~6/RELEASE_X86_64 x86_64

我尝试了这里建议的方法:http://projects.skurfer.com/posts/2011/python_ldap_lion/

但当我尝试使用pip时,出现了不同的错误:

Modules/LDAPObject.c:18:10: 致命错误:找不到'sasl.h'文件

*#include sasl.h

我还尝试了这里建议的方法:python-ldap OS X 10.6 and Python 2.6

但是同样出现了相同的错误。

我希望有人能够帮助我解决这个问题。

6个回答

96

使用@hharnisc和@mick-t答案中的部分内容。

pip install python-ldap \
   --global-option=build_ext \
   --global-option="-I$(xcrun --show-sdk-path)/usr/include/sasl"

我在 Mac 上没有 sudo 权限,这个方法很管用! - attaboyabhipro
这个方法在Yosemite上对我也起作用了。我不需要安装任何与macports或homebrew相关的东西来完成这个特定的安装。谢谢! - etteyafed
1
这也适用于启用系统完整性保护的El Capitan / 10.11。 - zakx
2
我手动创建链接时遇到了问题,就像@hharnisc的解决方案中所示(即使使用sudo也会出现“ln:/usr/include:操作不允许”的错误),但这在El Capitan上可以运行。 - Chris Vandevelde
为了解决权限问题并隔离库的安装,我建议使用virtualenv: "python -m virtualenv /yoursource; /yoursouhce/bin/pip install blah" 这将在本地安装所有内容,并避免与其他项目发生冲突。 - Cross
该答案在Mojave 10.14.3下仍然有效。 - Paraita

32

解决方法
/usr/include 似乎已经被移动了

$ xcrun --show-sdk-path    
$ sudo ln -s <the_path_from_above_command>/usr/include /usr/include

现在运行 pip install 命令!


1
我刚看到这个,没有运气。 - gprx100
1
太棒了!这刚刚解决了我这边很多问题。 - lip
对我来说,在OSX Mavericks上工作良好。 - Casey
4
在Yosemite系统中对我有效。以下是一行命令:“sudo ln -s xcrun --show-sdk-path/usr/include /usr/include”。 - juanpaco
9
如果您启用了SIP,则此方法已经不再适用于 El Capitan。另一种方法(向pip传递“-I”参数)可以使用。 - Brandon LeBlanc

24
在我的情况下,我不能简单地使用其他答案中提到的pip参数,因为我正在使用它与tox一起从一个requirements.txt文件安装依赖项,并且我需要我的tox.ini与非Mac环境保持兼容。我能够以更简单的方式解决这个问题:导出CFLAGS,使其添加包含路径到已由Xcode安装的sasl头文件中。
$ pip install python-ldap
    ...
    building '_ldap' extension
    creating build/temp.macosx-10.10-x86_64-2.7
    creating build/temp.macosx-10.10-x86_64-2.7/Modules
    clang -fno-strict-aliasing -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -DHAVE_SASL -DHAVE_TLS -DHAVE_LIBLDAP_R -DHAVE_LIBLDAP_R -DLDAPMODULE_VERSION=2.4.19 -IModules -I/opt/openldap-RE24/include -I/usr/include/sasl -I/usr/include -I/Users/bc/.pyenv/versions/2.7.10/include/python2.7 -c Modules/LDAPObject.c -o build/temp.macosx-10.10-x86_64-2.7/Modules/LDAPObject.o
    Modules/LDAPObject.c:18:10: fatal error: 'sasl.h' file not found
    #include <sasl.h>
             ^
    1 error generated.
    error: command 'clang' failed with exit status 1

$ export CFLAGS="-I$(xcrun --show-sdk-path)/usr/include/sasl"

$ pip install python-ldap
...
Successfully installed python-ldap-2.4.19

根据您是否使用任何用户友好型Python工具(我使用pyenv),您可能需要在pip命令前加上sudo


2
在我的OS X Yosemite系统中运行良好。谢谢! - trungly
1
还有 High Sierra。+1 :) - Kaos

5
我有同样的问题。我在我的Mac上使用Macports,并安装了cyrus-sasl2,它提供了/opt/local/include/sasl/目录下的sasl.h文件。您可以使用pip的global-option参数传递选项给build_ext。要将include路径传递到/opt/local/include/sasl/sasl.h,请像这样运行pip: pip install python-ldap --global-option=build_ext --global-option="-I/opt/local/include/sasl"
或者,您可以将其指向xcrun --show-sdk-path输出的任何内容。在我的电脑上是: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk
然后,您需要确定sasl头文件的路径。对于我来说,这是: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/sasl/
如果您需要帮助,请告诉我。

sudo pip install python-ldap --global-option=build_ext --global-option="-I$(xcrun --show-sdk-path)/usr/include/sasl" 下载/解压python-ldap时出现错误<urlopen error [Errno 1] _ssl.c:504: error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm>,该错误来源于https://pypi.python.org/simple/python-ldap/中的https://pypi.python.org/packages/source/p/python-ldap/python-ldap-2.4.19.tar.gz#md5=b941bf31d09739492aa19ef679e94ae3。 - gprx100

1

我结合了一些关于这个问题的帖子(包括这个)最终得出了这个解决方案(从一个更大的脚本中复制而来):

export XC_SDK=$(xcrun --show-sdk-path)
export USR_INC=$XC_SDK/usr/include
export PATH=$USR_INC:$PATH

echo "installing python-ldap"
ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install python-ldap

你可以使用python -c "import ldap"进行测试。
我没有遵循@hharnisc的建议的主要原因是在我的本地机器上,/usr/local没有移动,所以我只是临时将$XC_SDK放在路径前面,这似乎可行。
一些来源:
如何在Macosx 10.9上安装PIL?

0

运行buildout时,我遇到了这个错误。

我找到了sasl.h文件并进行了修复:

mdfind -name sasl.h

然后定义相应的CFLAGS环境变量:

export CFLAGS="-I/opt/local/include/sasl"

最后再次运行buildout。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接