Python、C++ 混合编程

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

 

Share this to:

发表评论

电子邮件地址不会被公开。 必填项已用*标注