Python3.X使用Cython调用C/C++

简介: Python3.X使用Cython调用C/C++

Python3.X使用Cython调用C/C++


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!


相关文章
|
29天前
|
jenkins Shell 测试技术
|
29天前
|
安全 jenkins Java
Java、Python、C++支持jenkins和SonarQube(一)
Jenkins 是一个开源的 持续集成(CI)和持续交付(CD) 工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
122 5
|
29天前
|
jenkins Java Shell
Java、Python、C++支持jenkins和SonarQube(全集)
Jenkins 是一个开源的持续集成(CI)和持续交付(CD)工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
160 1
|
29天前
|
jenkins Java 持续交付
|
29天前
|
jenkins Java 测试技术
|
8月前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
262 12
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
1118 0
|
编译器 开发工具 C++
【Python】已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build
【Python】已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build
6621 0
|
12月前
|
C++ Python
探索Python与C/C++混合编程的艺术
探索Python与C/C++混合编程的艺术
290 1
|
存储 C语言 Python
通过 Cython 带你认清 Python 变量的本质
通过 Cython 带你认清 Python 变量的本质
127 8

推荐镜像

更多