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

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

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


1 创建C/C++代码文件

假设我们要在Python代码中要调用如下C语言实现的mul函数将两个整数相乘,函数add将两个整数相加,创建demo_module.c,代码如下

// pulls in the Python API 
#include <Python.h>
static int mul(int a,int b){
    return a*b;
}
static int add(int a,int b){
    return a+b;
}
// C function always has two arguments, conventionally named self and args
// The args argument will be a pointer to a Python tuple object containing the arguments.
// Each item of the tuple corresponds to an argument in the call's argument list.
static PyObject* demo_mul_and_add(PyObject *self, PyObject *args)
{
    const int a, b;
    // convert PyObject to C values
    if (!PyArg_ParseTuple(args, "ii", &a, &b))
        return NULL;
    int c=mul(a,b);
    int d=add(c,c);
    // convert C value to PyObject
    return Py_BuildValue("i", d);
}
// module's method table
static   PyMethodDef DemoMethods[] = {
    {"mul_and_add", demo_mul_and_add, METH_VARARGS, "Mul and Add two integers"},
    {NULL, NULL, 0, NULL} 
};
static struct PyModuleDef demomodule = {
    PyModuleDef_HEAD_INIT,
    "demo", /* module name */
    NULL, /* module documentation, may be NULL */
    -1,
    DemoMethods /* the methods array */
};
PyMODINIT_FUNC PyInit_demo(void)
{
    return PyModule_Create(&demomodule);
}

1.1 函数demo_mul_and_add

其中,函数demo_mul_and_add是C语言与Python语言的桥梁函数。demo_mul_and_add函数内使用PyArg_ParseTuple函数将Python类型的参数转为C语言中的数据类型。其中参数ii表示连续两个Python中的int数据转为C语言中的int。常用的数据类型转换如下。

image.png

与函数PyArg_ParseTuple相反,函数Py_BuildValue将C语言中的数据类型转为Python对象,类型映射关系是一致的,看几个简单例子如下。

image.png

1.2 属性DemoMethods和demomodule

定义的PyMethodDef类型属性DemoMethods用于登记转换的函数列表,即本例的demo_mul_and_add函数,其中"mul_and_add"用于指定Python代码中调用该函数时对应的函数名称。

定义的PyModuleDef类型属性demomodule 用于Module名称及其中的函数列表。

1.3 PyMODINIT_FUNC

PyMODINIT_FUNC 用于指定初试化入口函数,其中PyModule_Create用于创建模块

2 创建setup.py

写好了Module中的C代码后,接下来要将其编译为pyd文件(pyd文件能直接被Python代码import)。Python中提供了工具函数直接编译,示例代码如下。

from distutils.core import setup, Extension
module1 = Extension('demo',
                    sources = ['demo_module.c']
                    )
setup (name = 'a demo extension module',
       version = '1.0',
       description = 'This is a demo package',
       ext_modules = [module1])

3 执行编译

调用setup.py,即输入如下命令:

python setup.py build_ext --inplace

其中,–inplace表示在源码处生成pyd文件。执行上面命令后,会得到如下文件。

demo.cp36-win_amd64.pyd

4 测试

测试如下:

>>> import demo
>>> print(demo.mul_and_add(2,3))
12
>>> print(demo.mul_and_add(1,1))
2


相关文章
|
6月前
|
人工智能 机器人 C++
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
【C++/Python】Windows用Swig实现C++调用Python(史上最简单详细,80岁看了都会操作)
136 0
|
6月前
|
编译器 测试技术 C++
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
【Python 基础教程 01 全面介绍】 Python编程基础全攻略:一文掌握Python语法精髓,从C/C++ 角度学习Python的差异
273 0
|
3月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
229 0
|
5月前
|
Ubuntu C++ Docker
Docker的基本指令和HTML/PYTHON/C++的简单创建示例
Docker的基本指令和HTML/PYTHON/C++的简单创建示例
|
4月前
|
编译器 开发工具 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
1938 0
|
1月前
|
C++ Python
探索Python与C/C++混合编程的艺术
探索Python与C/C++混合编程的艺术
36 1
WK
|
2月前
|
机器学习/深度学习 Java 程序员
为什么Python比C++慢很多?
Python相较于C++较慢主要体现在:动态类型系统导致运行时需解析类型,增加开销;作为解释型语言,逐行转换字节码的过程延长了执行时间;自动内存管理和垃圾回收机制虽简化操作但也带来了额外负担;全局解释器锁(GIL)限制了多线程性能;尽管Python库方便灵活,但在性能上往往不及C++底层库。然而,Python在某些领域如数据分析、机器学习中,凭借其高级别抽象和简洁语法仍表现出色。选语言需依据具体应用场景和需求综合考量。
WK
73 1
|
3月前
|
Unix C语言 C++
Python调用C/C++
Python调用C/C++
25 2
|
3月前
|
PHP C++ Python
右手坐标系,空间点绕轴旋转公式&程序(Python和C++程序)
右手坐标系,空间点绕轴旋转公式&程序(Python和C++程序)
63 0
WK
|
3月前
|
机器学习/深度学习 运维 Java
Python 相对于 C++ 有哪些明显的优势
C++是一种强大且高效的编程语言,被广泛应用在系统软件、游戏开发、嵌入式系统等多个领域。然而Python在某些方面展现出显著优势:Python语法简洁直观,易于学习与使用,提高了代码的可读性和团队协作效率;拥有丰富的第三方库和框架资源,能有效提升开发效率;具备良好的跨平台性,无需大量修改即可适应不同操作系统;
WK
52 0