Я пишу приложение на 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()
Любая ссылка на общее чтение также приветствуется.
Да. Вы можете создать расширение 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})
Краткий ответ: Да, конечно. Все, что вам нужно — это обернуть код 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 очень простым и легким в использовании.