2014-01-29 71 views
4

我正在用多個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,只是通過自制軟件安裝的一個。

回答

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)