2013-11-15 49 views
5

我使用swig從C++文件構建python模塊,並且在OSX 10.8的主目錄中還有一個本地版本的python 2.7。我想用我的本地python構建,但是osx有一個系統python,這會導致一些麻煩。我收到以下錯誤將鏈接鏈接到OSX Lion上的特定python庫

>>> import example 
Fatal Python error: PyThreadState_Get: no current thread 
Abort trap: 6 

它根據瀏覽四周,這是由於我的蟒蛇執行,但模塊鏈接兌制蟒蛇。

我部署一個小痛飲例如,as from tutorial,然後鏈接如下

gcc -shared -I builddir/include/python2.7/ example.c example_wrap.c \ 
    -o _example.so -L builddir/lib/python2.7/ -lpython2.7 

果然,_example.so保持對系統蟒蛇結合,可能是因爲框架是第一位的分辨率,雖然我我不確定這是在鏈接時還是在執行時。

_example.so: 
    _example.so (compatibility version 0.0.0, current version 0.0.0) 
    /System/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.2) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0) 

我該如何強制它綁定到我自己的python庫?

編輯:我成功地設法使它通過做

install_name_tool -change 
     /System/Library/Frameworks/Python.framework/Versions/2.7/Python 
     @executable_path/../lib/libpython2.7.dylib 

進口,但它的感覺就像一個黑客攻擊。我能不能讓鏈接器爲我找到庫並在其中添加適當的參考?我不能只是指定庫名(libpython2.7.dylib),並讓它在運行時解決,因爲它發生在Linux?

+1

由於沒有ldconfig等同於dyld(或者爲系統添加任意新路徑來爲dyld'拾取'新庫的能力 - 我敢打賭,install_name_tool事情可能是最接近你的解決方案,不會(1)安裝到系統庫路徑(/ lib,/ usr/lib)或DYLD_ *環境變量。另一個解決方案是鏈接到一個靜態Python庫(.a) – synthesizerpatel

+0

最近有一個簡單的問題在virtualenv中使用了cython擴展,它曾經在(osx 10.7)之前工作,不知道是什麼改變了,因此想知道權威答案。PS我已經看到了一個hack解決方案,目標'.dylib'被重命名,正確的版本可能會鏈接到... –

+0

我打算建議在virtualenv中嘗試這個,但有趣的是@qarma在那裏有類似的問題。 – cm2

回答

1

您將需要測試解決方案,因爲我沒有曬黑OSX機器在這裏測試,但我認爲這是可以解決你的問題:

創建(或修改)運行腳本和更改你的別名或你的PATH變量:

alias python='/your/local/python' 
PATH=/your/local/python:$PATH 

# Run your app here 

讓我知道這是否有幫助。