2016-11-22 7 views
3

У меня есть программа на C++, и я хочу добавить систему расширений с помощью Python. Но для этого мне нужно сопоставить вызовы метода объекта Python на вызовы методов C++. Возможно ли это, и если да, то как это сделать.C++ и Python плотно интегрируются

Пример:
Python часть:

class Extension(AbstractExtension): 
    def __init__(self, cool_cpp_object): 
     self.o = cool_cpp_object 

    def some_method(self): 
     self.o.method_to_cpp() 

C++, часть:

class SomeClass : public AnotherClass 
{ 
public: 
    void method_to_cpp(); 
} 

Я должен передать экземпляр SomeClass методу экземпляра Extension. Спасибо.

+2

Дайте [Boost.Python] (http://www.boost.org/doc/libs/1_62_0/libs/python/doc/html/tutorial/tutorial/exposing.html#tutorial.exposing.constructors) переход – StoryTeller

ответ

3

Существует несколько способов сделать это (StoryTeller правильно отмечает Boost :: Python, и есть Swig). Лично я считаю, что Cython's C++ integration исключительно прост в использовании.

Создать какой-либо файл заголовка, скажем classes.hpp, и в ней поставил (наряду с охраной и т.д.):

class SomeClass : public AnotherClass 
{ 
public: 
    void method_to_cpp(); 
} 

Место реализации в файле реализации обычным способом.

Теперь создайте Cython файл с экспортом интерфейса вы будете использовать:

cdef extern from "classes.hpp": 
cdef cppclass SomeClass: 
    method_to_cpp() 

и Python обертка:

cdef class PySomeClass: 
    cdef SomeClass obj 

    def method(self): 
     self.obj.method_to_cpp() 

Вот так, в принципе. Вы можете импортировать и использовать PySomeClass, как обычный класс Python.

Ссылка, приведенная выше, должна объяснить, как создать все файлы.

+0

Хорошо, я снял ссылку, и очень легко интегрировать C++ в python, но я до сих пор не понял, как передать уже созданный объект C++ на Python. – Megaxela

+2

@Megaxela Это (Cython) член 'PySomeClass', который вы можете передать как обычный объект Python. Другой код Python может вызывать элементы 'PySomeClass', а его члены могут вызывать методы объекта C++. –