我正在构建一个包含多个C扩展的Python项目,需要libhdf5。我在/usr/local/lib
安装了libhdf5。对于测试和开发,我想针对位于/Users/name/some/path
的私有版本的HDF5进行开发。
在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>
并推测clang正在链接它可以找到的第一版HDF5。
有没有办法强制distutils链接到我的库的私有版本?我不需要可重定位的版本,所以我不关心@rpath
等等。
我也确认系统Python不会发生这种情况,只是通过自制软件安装的系统。
答案 0 :(得分:1)
我的简短回答是:不要使用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)