Ответы пользователя по тегу C++
  • Как использовать метод C++ в коде на Python?

    sanya84
    @sanya84
    Фанатик Python 3
    Сам напросился БАТАН)
    С начала создаём заголовочный файл C++ (Да простят меня C++-шники:-))
    Person.hpp
    #ifndef PERSON_H
    #define PERSON_H
    
    #include <string>
    
    using namespace std;
    
    namespace person{
        class CppPerson{
            public:
                string name;
                int age;
                CppPerson();
                CppPerson(const string &name, const int &age);
                ~CppPerson();
                void setName(const string &name);
                string getName();
                int getAge();
        };
    }
    #endif

    Далее реализация
    Person.cpp
    #include <string>
    #include "Person.hpp"
    
    
    namespace person{
        CppPerson::CppPerson(){}
    
        CppPerson::CppPerson(const string &name, const int &age){
            this->name = name;
            this->age = age;
        }
        CppPerson::~CppPerson(){}
    
        void CppPerson::setName(const string &name){
            this->name = name;
        }
    
        string CppPerson::getName(){
            return name;
        }
    
        int  CppPerson::getAge(){
            return age;
        }
    }

    Далее в дело вступает как раз таки Cython
    person_module.pyx
    from libcpp.string cimport string
    
    cdef extern from "Person.hpp" namespace "person":
        cdef cppclass CppPerson:
            CppPerson(string name, int age) except +
            void setName(string name)
            string getName()
            int getAge()
    
    
    cdef class Person:
        cdef CppPerson *cpp_person
    
        def __cinit__(self, name, age):
            self.cpp_person = new CppPerson(name.encode(), age)
            if self.cpp_person == NULL:
                raise MemoryError('Not enough memory.')
    
        def __dealloc__(self):
            del self.cpp_person
        def setName(self, name):
            self.cpp_person.setName(name.encode())
        def getName(self):
            return self.cpp_person.getName().decode()
        def getAge(self):
            return self.cpp_person.getAge()

    Далее
    setup.py
    from distutils.core import setup, Extension
    from Cython.Build import cythonize
    
    setup(ext_modules = cythonize(Extension(
               "person_module",                                                 # the extesion name
               sources=["person_module.pyx", "Person.cpp"],     # the Cython source and
                                                                                           # additional C++ source files
               language="c++",                                                   # generate and compile C++ code
          )))

    Теперь нужно всё это чудо скормить Cython-у
    В той же папке где находятся все эти файлы запускаем cmd (Или с начала запускаем cmd а потом
    переходим в эту директорию)

    В cmd прописываем
    python setup.py build_ext --inplace
    Ну и тест
    test.py
    from person_module import Person
    
    def main():
        alexandr = Person("Александр", 35)
        print(alexandr.getName())
        print(alexandr.getAge())
    
    if __name__ == '__main__':
        main()

    Документация о Cython
    Ответ написан
    3 комментария