前言
在项目开发中,因为某些原因,需要使用C++开源库,所以在网上和chatGPT上搜罗了一番教程。按照chatGPT DEMO,在微调后,成功运行,特记录过程。
开发准备
开发环境说明:python3.9.13
必须的python包:cython,安装命令pip install cython
开发工具:pycharm
操作系统:windows10
操作步骤
1.新建myclass.h文件
class MyClass {
public:
MyClass(int value);
int getValue();
private:
int data;
};
2.新建myclass.cpp文件
#include "myclass.h"
MyClass::MyClass(int value) : data(value) {}
int MyClass::getValue() {
return data;
}
3.新建myclass_wrapper.pyx文件
# myclass_wrapper.pyx
# cython: language_level=3
import ctypes
cdef extern from "myclass.h":
cdef cppclass MyClass:
MyClass(int value)
int getValue()
cdef class PyMyClass:
cdef MyClass *thisptr
def __cinit__(self, int value):
self.thisptr = new MyClass(value)
def __dealloc__(self):
del self.thisptr
def get_value(self):
return self.thisptr.getValue()
4.新建setup.py文件
from setuptools import setup
from distutils.extension import Extension
from Cython.Build import cythonize
extensions = [
Extension(
"myclass_wrapper",
sources=["myclass_wrapper.pyx", "./myclass.cpp"],
language="c++",
extra_compile_args=['/std:c++latest']
)
]
setup(
ext_modules=cythonize(extensions),
)
5.编译
python setup.py build_ext --inplace
以上操作均在同一目录下完成,操作完成后,在目录中生成编译后的公用库:.pyd结尾的文件(作者的是myclass_wrapper.cp39-win_amd64.pyd),接下来就是测试。
6.测试
新建myclass.py
from myclass_wrapper import PyMyClass
obj = PyMyClass(42)
print(obj.get_value())
测试结果:
7.附录
编译后的文件价的构成
如果需要了解各个文件中的语法,请大家自行查询,这里不做赘述。