我正在使用swig从c ++文件构建一个python模块,我在OSX 10.8上的主目录中也有一个本地版本的python 2.7。我想使用我的本地python构建,但是osx有一个系统python,这会导致一些麻烦。我收到以下错误
>>> import example
Fatal Python error: PyThreadState_Get: no current thread
Abort trap: 6
根据浏览,这是由于我的python执行,但模块链接系统python。
我部署了一个小的swig示例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继续绑定系统python,可能是因为框架在分辨率中排在第一位,虽然我不确定这是在链接时还是在执行时。
_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中?
答案 0 :(得分:1)
你需要测试解决方案,因为我没有tan OSX机器来测试它,但我认为这可以解决你的问题:
创建(或编辑一个)运行脚本并更改别名或PATH变量:
alias python='/your/local/python'
PATH=/your/local/python:$PATH
# Run your app here
如果有帮助,请告诉我。