Python 、C++ 的混合编程大致分为两类,即两者的相互调用,Python 调用 C++ 代码是本文的重点。
其它部分可以参考 here
- 使用Boost.Python手动包装一个简单的C ++类
1.首先,创建一个 Pig.hpp 该头文件包含 Python 的调用类。
#include <iostream> #include <string> class Pig { // Private attribute std::string m_msg; public: // Constructor Pig(std::string msg):m_msg(msg) { } // Methods void greet() { std::cout << m_msg << std::endl; } // Getter/Setter functions for the attribute void set_msg(std::string msg) { this->m_msg = msg; } std::string get_msg() const { return m_msg; } };
2.创建一个 PyPig.cpp
#include <boost/python.hpp> #include "Pig.hpp" using namespace boost::python; BOOST_PYTHON_MODULE(pylib) { class_< Pig >("Pig", init<std::string>()) .def("greet", &Pig::greet) .add_property("msg", &Pig::get_msg, &Pig::set_msg); }
此处需要解释。
BOOST_PYTHON_MODULE 宏声明了一个名为 pylib 的Python模块。然后,我们可以通过在括号之间添加适当的声明来向此模块添加类或函数。
添加类!首先创建一个新的 class_ <>对象。这个对象的模板就是我们要导出的类,在这个例子中,class_ <Pig> 将我们的 C ++ 类包装到 Python 中。class_ <>()构造函数的第一个参数表示我们想在 Python 中调用 Pig 类的名称,这里,使用与 C ++ 相同的名称,“Pig”,但不强制要求一致。第二个参数用于定义要使用哪一个 C ++ 构造函数。这里只有一个 C ++ 构造函数,但是 C ++ 类可以有多个构造器。要确定要包装哪个构造器给Python,我们可以使用init <>对象,该模板对应于构造函数的原型,这里是std :: string类型的单个参数。
仅声明一个类只会创建一个空的 Python 类,我们还需要声明我们希望从 C ++ 导出的方法和属性。可以使用 def()函数添加方法,第一个参数是你希望在 Python 中使用的函数名,第二个参数是写好的 C ++ 代码的方法名。最后,使用 add_property()向Python 类添加一个属性,以便我们可以查询和编辑问候消息的内容。这个函数的第一个参数是 Python 中属性的名称,第二个参数是 C ++ 实现中对 getter 和 setter 函数的引用。
编译!
g++ -I/usr/include/python2.7 -fpic PyPig.cpp -shared -lboost_python -oPyPig.so