简单的boost :: python程序崩溃

时间:2014-06-28 15:33:07

标签: python c++ boost

我需要将cpp扩展集成到python中。因此我认为boost :: python可能是一个很好的方法。有一个简单的例子来运行我目前有一些我不明白的问题。看看下面的代码:

betainv.cpp

#include <boost/python.hpp>
#include <boost/math/distributions/beta.hpp>

using namespace boost::python;

class betainvClass {
    public: double betainv(double p, double a, double b);
};

double betainvClass::betainv(double p, double a, double b) { 
    return boost::math::ibeta_inv(a, b, p);
}

// Expose classes and methods to Python
BOOST_PYTHON_MODULE(betainv) {
    class_<betainvClass> ("create_betainv_instance")
        .def("betainv", &betainvClass::betainv)
    ;
}

相应的python实现:

import betainv

beta = betainv.create_betainv_instance()
print "0.25, 0.0342, 170 -> " + str(beta.betainv(0.25, 0.0342, 170))
print "0.25, 0.0342, 171 -> " + str(beta.betainv(0.25, 0.0342, 171))
print "0.25, 0.0342, 172 -> " + str(beta.betainv(0.25, 0.0342, 172))

和Makefile

TARGET = betainv
PYTHON = /usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/include/python2.7
BOOST_INC = /usr/local/include
BOOST_LIB = /usr/local/lib

$(TARGET).so: $(TARGET).o
    g++ -shared -Wl \
    $(TARGET).o -L$(BOOST_LIB) -lboost_python \
    -L/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config -lpython2.7 \
    -o betainv.so

$(TARGET).o: $(TARGET).cpp
    g++ -I$(PYTHON) -I$(BOOST_INC) -c $(TARGET).cpp

clean:
    rm -f *.o *.a *.so *~ core

编译工作正常。但是,在执行程序时,我收到以下错误:

python betainv.py 
Fatal Python error: PyThreadState_Get: no current thread
Abort trap: 6

有人知道我在这里做错了吗?

1 个答案:

答案 0 :(得分:1)

好的,我明白了。实际上上面的代码是正确的。但是,我正在使用Mac OS X,我将boost库与Homebrew的python安装相关联。编译后,我使用原始的Apple版python执行python代码。因此存在二进制不兼容性(有关详细信息,请参见此处:Homebrew + Python on mac os x 10.8: Fatal Python error: PyThreadState_Get: no current thread importing mapnik

使用Homebrew python安装运行代码可以正常工作。

感谢您阅读任何方式。