如何将python类包装到C ++类中?

时间:2013-12-17 19:53:34

标签: c++ python wrapper

我有一个实现给定功能的python类,例如文件 Test_script.py

class Test(object):
    def __init__(self,name):
        self.name=name
    def f1(self,n):
        return n**2
    def f2(self,n,m):
        return n+m
    def f3(self,word):
        print word

如何构建一个简单包装此类和所有函数的C ++类,以便该类可以依次被其他C ++类/代码使用? boost :: python是否有助于提供一些快捷方式?

为什么这有关系? 因为可以有一些具体的用例,在python中实现给定的功能要快得多,因为可以重复使用大量经过良好测试和记录的模块(例如解析,numpy函数......),而不是从头开始在C ++中。上面的类是玩具问题,一旦明确如何用C ++包装/嵌入它就很容易处理更复杂的功能。

THX

1 个答案:

答案 0 :(得分:4)

您是否查阅了有关在C ++应用程序中嵌入Python功能的文档?记下Boost.Python接口,尤其是Python Interpreter C API。 (Boost.Python更侧重于用C ++编写Python扩展而不是相反。)

供参考:

另请参阅我在这里的答案,了解C API的简单应用(从C应用程序中使用matplotlib):

这是另一个简单的例子,如何使用C API导入Python模块并在C ++应用程序中执行它们的功能。有关详细信息,请参阅文档。

#include <Python.h>
#include <boost/algorithm/string/join.hpp>
#include <vector>
#include <string>
#include <iostream>

int main(int argc, const char** argv) {
    // get data to hash
    if (argc < 2) {
        std::cout << "please add some command line args\n";
        return -1;
    }
    std::string data = boost::algorithm::join(
            std::vector<std::string>(argv+1, argv+argc), " ");
    std::cout << "compute md5 of string: '" << data << "'\n";
    // initialize Python API
    Py_Initialize();
    // import hashlib module
    PyObject *pHashlib = PyImport_ImportModule("hashlib");
    // get hash function
    PyObject *pHashlibMd5 = PyObject_GetAttrString(pHashlib, "md5");
    // build function argument tuple
    PyObject *pFuncParams = PyTuple_New(1);
    PyTuple_SetItem(pFuncParams, 0, PyString_FromString(data.c_str()));
    // call function
    PyObject *pMd5 = PyObject_CallObject(pHashlibMd5, pFuncParams);
    // get function to retrieve hex digest
    PyObject *pMd5Hexdigest = PyObject_GetAttrString(pMd5, "hexdigest");
    // call function
    PyObject *pRet = PyObject_CallObject(pMd5Hexdigest, 0);
    // print result
    std::cout << PyString_AsString(pRet) << "\n";
    // deinitialize
    Py_DECREF(pRet);
    Py_DECREF(pMd5Hexdigest);
    Py_DECREF(pMd5);
    Py_DECREF(pFuncParams);
    Py_DECREF(pHashlibMd5);
    Py_DECREF(pHashlib);
    Py_Finalize();
}

构建并运行:

$ g++ test.cc -I /usr/include/python2.7 -l python2.7
$ ./a.out Hello World
compute md5 of string: 'Hello World'
b10a8db164e0754105b7a99be72e3fe5

进行比较:

>>> import hashlib
>>> print hashlib.md5('Hello World').hexdigest()
b10a8db164e0754105b7a99be72e3fe5

希望这有帮助。