我有一个实现给定功能的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
答案 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
希望这有帮助。