上次我写了利用Python提供的API封装c函数,并调用。但是由于利用API的方式过于原始,对于类或者结构极度麻烦。因此,我选择了Boost的Python的来封装类,类似的工具还有SWIG等,选择Boost的原因是它不需要引入其他的接口描述语言,封装也是c++代码;另外,它支持的c++特性比较全。
Boost Python的文档,我推荐:http://www.maycode.com/boostdoc/boost-doc/libs/python/doc/。基本上,你遇到的问题,都可以找到答案。
下面贴一个例子,这个例子覆盖的面很全,需要好好理解。这个例子,是研究怎么封装C++。下一节,我会写一些高级的用法。
- #include <boost/python.hpp>
- #include <boost/python/module.hpp>
- #include <boost/python/def.hpp>
- #include <boost/python/to_python_converter.hpp>
- #include
- using namespace std;
- using namespace boost::python;
-
- namespace HelloPython{
-
- char const* sayHello(){
- return "Hello from boost::python";
- }
-
-
-
- class HelloClass{
- public:
- HelloClass(const string& name):name(name){
- }
- public:
- string sayHello(){
- return "Hello from HelloClass by : " + name;
- }
- private:
- string name;
- };
-
- string sayHelloClass(HelloClass& hello){
- return hello.sayHello() + " in function sayHelloClass";
- }
-
-
-
- typedef vector<int> ivector;
-
-
-
- void showPerson(string name,int age=30,string nationality="China"){
- cout << name << " " << age << " " << nationality << endl;
- }
-
-
- BOOST_PYTHON_FUNCTION_OVERLOADS(showPerson_overloads,showPerson,1,3)
-
-
- BOOST_PYTHON_MODULE(HelloPython){
-
- def("sayHello",sayHello);
-
-
- class_("HelloClass",init())
- .def("sayHello",&HelloClass::sayHello)
- ;
- def("sayHelloClass",sayHelloClass);
-
-
- class_("ivector")
- .def(vector_indexing_suite());
- class_ >("ivector_vector")
- .def(vector_indexing_suite >());
-
-
- def("showPerson",showPerson,showPerson_overloads());
- }
系列文章:
Python调用C/C++函数(1)
Python调用采用Boost Python封装的c++(2)
C++调用Python(3)
C++调用Python(4)
c++和Python互操作高级应用(5)