1 Создать код C++
Предположим, нам нужно позволить Python вызывать код C++ следующим образом (имя файлаdemo.h
):
#ifndef DEMO_H
#define DEMO_H
using namespace std;
namespace demo {
class MyDemo {
public:
int a;
MyDemo();
MyDemo(int a );
~MyDemo();
int mul(int m );
int add(int b);
void sayHello(char* name);
};
}
#endif
Соответствующий код реализации C++ выглядит следующим образом (demo.cpp
):
#include "demo.h"
#include <iostream>
namespace demo {
MyDemo::MyDemo () {}
MyDemo::MyDemo (int a) {
this->a = a;
}
MyDemo::~MyDemo () {}
int MyDemo::mul(int m) {
return this->a*m;
}
int MyDemo::add (int b) {
return this->a+b;
}
void MyDemo::sayHello(char* name){
cout<<"hello "<<name<<"!"<<endl;
}
}
2 написатьpxd
документ
pxd
файл можно увидеть какCython
(которыйpyx
файл) заголовочные файлы, оpxd
иpyx
Файл можно понять просто следующим образом:
pxd
файлpyx
иC/C++
мост между.pyx
даC/C++
иPython
мост между.
теперь, когдаpxd
является заголовочным файлом, то есть сdemo.h
очень похоже, создатьcdemo.pxd
файл, содержание следующее.
cdef extern from "demo.cpp":
pass
# Decalre the class with cdef
cdef extern from "demo.h" namespace "demo":
cdef cppclass MyDemo:
MyDemo() except +
MyDemo(int) except +
int a
int mul(int )
int add(int )
void sayHello(char*)
3 написатьpyx
документ
Я сказал раньше,pyx
файлC/C++
иPython
мост междуpyx
файл будетC/C++
Код завернут в слой, что удобно для Python, чтобы напрямую вызывать и создаватьadapter.pyx
файл, код выглядит следующим образом.
# distutils: language = c++
from cdemo cimport MyDemo
# Create a Cython extension type which holds a C++ instance
# as an attribute and create a bunch of forwarding methods
# Python extension type.
cdef class PyMyDemo:
cdef MyDemo c_mydemo # Hold a C++ instance which we're wrapping
def __cinit__(self,a):
self.c_mydemo = MyDemo(a)
def mul(self, m):
return self.c_mydemo.mul(m)
def add(self,b):
return self.c_mydemo.add(b)
def sayHello(self,name ):
self.c_mydemo.sayHello(name)
Среди них первая линия# distutils: language = c++
укажет текущий файл для созданияC++
документ. Создайте класс PyMyDemo для использованияC/C++
Код инкапсулирован в слой, поэтому Python можно вызывать напрямую.
4 Создатьsetup.py
документ
setup.py
Файл относительно простой, код выглядит следующим образом.
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize("adapter.pyx"))
5 Выполните компиляцию
Введите в консоли следующую команду:
python setup.py build_ext --inplace
После выполнения команды она будет сгенерирована в текущем каталогеadapter.cpp
, этот документ основан наadapter.pyx
Сгенерировано. также будет генерироватьadapter.cp36-win_amd64.pyd
документ(Linux
В соответствии с окружающей средойso
документ). здесьpyd
Файл является соответствующим файлом для платформы Windows, и это файл, который нам нужен.
6 тест
Результаты теста следующие
>>> from adapter import PyMyDemo
>>> demo=PyMyDemo(2)
>>> demo.add(1)
3
>>> demo.mul(2)
4
>>> demo.sayHello(b'HuaChao')
hello HuaChao!