2013-11-15 52 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 

让我知道这是否有帮助。