[英]Calling C++ methods from python
I stuck with some problem in calling C++ methods in python I got this following link in stack overflow 我在用python调用C ++方法时遇到一些问题, 在堆栈溢出中得到了以下链接
But I don't to use Boost package and swig. 但是我不使用Boost包和swig。 Is there any approach in python can used to call these C++ methods. python中是否可以使用任何方法来调用这些C ++方法。 I am compiling C++ as a shared object in Linux and using in Python 2.7 我将C ++编译为Linux中的共享对象,并在Python 2.7中使用
#include <iostream>
using namespace std;
class Polygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b; }
};
class Rectangle: public Polygon {
public:
int area()
{ return width*height; }
};
class Triangle: public Polygon {
public:
int area()
{ return width*height/2; }
};
int main () {
Rectangle rect;
Triangle trgl;
Polygon * ppoly1 = ▭
Polygon * ppoly2 = &trgl;
ppoly1->set_values (4,5);
ppoly2->set_values (4,5);
cout << rect.area() << '\n';
cout << trgl.area() << '\n';
return 0;
}
Could please guide to achieve this. 可以指导实现这一点。 Any code snippet or example will be highly appreciated. 任何代码段或示例都将受到高度赞赏。
Thanks in advance -- 提前致谢 -
This answer is for Python2.x only! 这个答案仅适用于Python2.x!
When you want to write a C++-extension, you first need to download the python-dev
package to get all the needed libs and header files (only needed on Linux) 当您想编写C ++扩展名时,首先需要下载python-dev
软件包以获取所有需要的库和头文件(仅在Linux上需要)
The most important part in the following source is PolygonObject
and PyTypeObject
. 以下资源中最重要的部分是PolygonObject
和PyTypeObject
。
PolygonObject 多边形对象
An object of this class represents your Polygon instance in Python. 此类的对象表示您在Python中的Polygon实例。 As you can see it contains a pointer obj
which is your original object. 如您所见,它包含一个指针obj
,它是您的原始对象。
PyTypeObject PyTypeObject
https://docs.python.org/2/c-api/type.html#c.PyTypeObject https://docs.python.org/2/c-api/type.html#c.PyTypeObject
The C structure of the objects used to describe built-in types. 用于描述内置类型的对象的C结构。
Here is how you can use your Polygon object: 这是使用多边形对象的方法:
import libfoo
po = libfoo.Polygon()
po.set_values(1, 2)
Here is the module implementation ( libfoo.cpp
). 这是模块实现( libfoo.cpp
)。 This example does not contain inheritance but the keyword you have to look for is tp_base
. 此示例不包含继承,但您要查找的关键字是tp_base
。 Also the original Python source has a lot of examples which can help here a lot. 同样,原始的Python源代码提供了很多示例,可以在这里大有帮助。
#include <Python.h>
// this is your original class
class Polygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b; }
};
typedef struct {
PyObject_HEAD
Polygon* obj;
} PolygonObject;
static void
Polygon_dealloc(PolygonObject* self)
{
delete self->obj;
self->ob_type->tp_free((PyObject*)self);
}
static PyObject *
Polygon_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PolygonObject *self;
self = (PolygonObject*)type->tp_alloc(type, 0);
if (self != NULL) {
self->obj = new Polygon;
// do your cleanup here
}
return (PyObject *)self;
}
static PyObject* Polygon_set_values(PolygonObject* self, PyObject *args, PyObject *kwds)
{
int a, b;
const char* kwlist[] = {"a", "b", NULL};
if (! PyArg_ParseTupleAndKeywords(args, kwds, "ii", (char**)kwlist, &a, &b))
return NULL;
self->obj->set_values(a, b);
Py_INCREF(Py_None);
return Py_None;
}
static PyMethodDef Polygon_methods[] = {
{"set_values", (PyCFunction)Polygon_set_values, METH_VARARGS, "set the value"},
{NULL} /* Sentinel */
};
static PyTypeObject PolygonType = {
PyObject_HEAD_INIT(NULL)
0, /*ob_size*/
"mod.Polygon", /*tp_name*/
sizeof(PolygonObject), /*tp_basicsize*/
0, /*tp_itemsize*/
(destructor)Polygon_dealloc, /*tp_dealloc*/
0, /*tp_print*/
0, /*tp_getattr*/
0, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
0, /*tp_as_number*/
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
0, /*tp_hash */
0, /*tp_call*/
0, /*tp_str*/
0, /*tp_getattro*/
0, /*tp_setattro*/
0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
"Polygon class", /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
Polygon_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
Polygon_new, /* tp_new */
};
static PyMethodDef module_methods[] = {
{NULL} /* Sentinel */
};
PyMODINIT_FUNC
initlibfoo()
{
PyObject* m;
if (PyType_Ready(&PolygonType) < 0)
return;
m = Py_InitModule3("libfoo", module_methods, "Example module that creates an extension type.");
if (m == NULL)
return;
Py_INCREF(&PolygonType);
PyModule_AddObject(m, "Polygon", (PyObject *)&PolygonType);
}
clang++ -shared -I/usr/include/python2.7/ -fPIC libfoo.cpp -o libfoo.so -lpython clang ++-共享-I / usr / include / python2.7 / -fPIC libfoo.cpp -o libfoo.so -lpython
Here are two additional links which give you more information and a deeper technical background how to extend Python. 这是两个附加链接,它们可为您提供更多信息以及如何扩展Python的更深层次的技术背景。
https://docs.python.org/2/extending/newtypes.html https://docs.python.org/2/extending/extending.html https://docs.python.org/2/extending/newtypes.html https://docs.python.org/2/extending/extending.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.