Homebrew/Python:说服distutils链接到OS X上的特定库?

问题描述:

我正在用多个C扩展创建一个需要libhdf5的Python项目。我有一个现有的libhdf5安装在/usr/local/lib。对于测试和开发,我想针对位于/Users/name/some/path的HDF5的私人版本进行开发。Homebrew/Python:说服distutils链接到OS X上的特定库?

在setup.py中,我通过将“library_dirs”(和“runtime_library_dirs”,尽管在OS X上不做任何事情)设置为/Users/name/some/path来处理这个问题。在Linux上,这工作正常。

问题是,当我的扩展模块被编译时,它们与/usr/local/lib中的HDF5副本链接,并且setup.py中没有任何调整可以说服他们。

通过在运行Python时设置DYLD_LIBRARY_PATH=/Users/name/some/path,我已经成功加载了HDF5的私有构建,因此我知道该库已正确构建并工作。

运行在我的扩展名之一otool -L产生这样的:

h5py/_errors.so: 
/usr/local/lib/libhdf5.8.dylib (compatibility version 9.0.0, current version 9.1.0) 
/usr/local/lib/libhdf5_hl.8.dylib (compatibility version 9.0.0, current version 9.1.0) 
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) 

这证实了我们对链接库的错误的副本。 我注意到,链接阶段是这样的:

clang -bundle -undefined dynamic_lookup -L/usr/local/lib -L/usr/local/opt/sqlite/lib -L/Users/name/some/path <more stuff>

和铛是连接对HDF5的第一个版本,它可以找到猜想。

有什么办法强制distutils链接我的私人建立的图书馆?我不需要一个可重定位的版本,所以我不在乎@rpath

我也证实,这不会发生与系统Python,只是通过自制软件安装的一个。

我的简短回答是:不要使用HomeBrew Python管理自制软件以外的版本。你可以在这里看到:https://github.com/Homebrew/homebrew/blob/master/Library/Formula/python.rb#L213他们已经将它们的库标记硬编码到Python Makefile本身中。

当然,能解决你的问题的回答更有意思:)

,你可以,如果你真的想要,猴子补丁sysconfig.get_config_vars()提前系统库注入你的标志。你也可以猴子补丁distutils。这些都不是特别强大。

在HashDist中,我们已经优先构建自己的Python,这很令人沮丧,但我们发现它是最强大的。 (我们支持OS X上的h5py)