我需要将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
有人知道我在这里做错了吗?
答案 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安装运行代码可以正常工作。
感谢您阅读任何方式。