Может ли расширение python-C ++ получить объект C ++ и вызвать его функцию-член?

Я пишу приложение на Python / C ++, которое будет вызывать методы в расширении C ++ из python.

Скажем, мой C ++ имеет класс:

class A
{
private:
int _i;
public:
A(int i){_i=i;}
int get_i(){return _i;}
}

A a=A();

Это в любом случае, что питон может получить a объект в C ++ и вызов его функции-члена, т.е.

import cpp_extension
a=cpp_extension.A()
print a.get_i()

Любая ссылка на общее чтение также приветствуется.

6

Решение

Да. Вы можете создать расширение Python C ++, где ваши объекты C ++ будут видны изнутри Python, как если бы они были встроенными типами.

Есть два основных способа сделать это.

1.Создайте расширение самостоятельно, следуя документации, представленной в API-документация CPython.

2. Создайте расширение с помощью такого инструмента, как повышение :: питона или же SWIG.

По моему опыту, Boost :: Python — лучший способ сделать это (он экономит вам огромное количество времени, и цена, которую вы платите, теперь зависит от повышения).

Для вашего примера привязки boost :: python могут выглядеть следующим образом:

// foo.cpp
#include <boost/python.hpp>

class A {

public:

A(int i)
: m_i{i} { }

int get_i() const {
return m_i;
}
private:
// don't use names such as `_i`; those are reserved for the
// implementation
int m_i;
};

BOOST_PYTHON_MODULE(foo) {
using namespace boost::python;

class_<A>("A", init<int>())
.def("get_i", &A::get_i, "This is the docstring for A::get_i")
;
}

Обобщение:

g++ -o foo.so foo.cpp -std=c++11 -fPIC -shared \
-Wall -Wextra `python2.7-config --includes --libs` \
-lboost_python

и запустить в Python:

>>> import foo
>>> a = foo.A(2)
>>> a.get_i()
2
>>> print a.get_i.__doc__

get_i( (A)arg1) -> int :
This is the docstring for A::get_i

C++ signature :
int get_i(A {lvalue})
5

Другие решения

Краткий ответ: Да, конечно. Все, что вам нужно — это обернуть код C ++ оболочкой Python.

Разработал:

Предположим, ваш код C ++ находится внутри class_file.h, В том же каталоге создайте .pxd файл с любым именем на ваш выбор со следующим содержанием

cdef extern from "class_file.h":
cdef cppclass A:
int _i
A(int)
int get_i

Это оболочка файла C ++. Это все, что вам нужно сделать, используя Cython. Далее вам нужно написать .pyx файл и cimport ваш pxd файл как простой модуль. Вы также должны иметь setup.py который создаст .so файл, который может быть импортирован Python так же легко, как и любой другой модуль python.

Посещать http://docs.cython.org/src/tutorial/cython_tutorial.html для получения дополнительной помощи. Надеюсь, вы найдете Cython очень простым и легким в использовании.

3

По вопросам рекламы [email protected]