【贤者之路】Python/c Api 扩展解析

本文介绍了如何使用Python/C API将C语言编写的函数扩展为Python接口。主要内容包括:Python/C API扩展的实现,C语言函数的封装,注册表的创建,以及`setup.py`脚本的编写。文章通过实例展示了如何处理C函数的输入输出,特别是对结构体的转换,并提醒在使用过程中注意参数匹配,避免TypeError。
摘要由CSDN通过智能技术生成

【前言】:最近在做的工程因为函数是用c写的,但是需要对外提供pyhton接口,研究了一下方法,发现几种方法调用,本文主要是介绍python/c api方法的实现

代码参照:https://github.com/chanzhennan/Extend_Python

 

【python / c】

python/c调用有三种方法,网上有大量的资料

【python/c api extension】:最多人用的一种方法,python端基本不动,改变c端代码,需要再写接驳函数

【ctypes / cython】:最方便的调用,c端代码不动,python端需要改变大量代码,比如类型,c_int c_float 直接将python改成c风格

【swig】:没用过,第三方库,可以自动大量生成。方便,但是内存容易出错。

我的老大说之前的项目用过swig,但是内存管理就是个噩梦,用起来各种内存报错但是不知道在哪里发生。

 

【实现】

【c语言函数】

那么我们先有一段简单的c函数,

#sample.h

/* sample.h */

#include <math.h>

extern int gcd(int, int);
extern int in_mandel(double x0, double y0, int n);
extern int divide(int a, int b, int *remainder);
extern double avg(double *a, int n);

typedef struct Point {
    double x,y;
} Point;

extern double distance(Point *p1, Point *p2);

#sample.c

/* sample.c */
#include "sample.h"

/* Compute the greatest common divisor */
int gcd(int x, int y) {
    int g = y;
    while (x > 0) {
        g = x;
        x = y % x;
        y = g;
    }
    return g;
}

/* Test if (x0,y0) is in the Mandelbrot set or not */
int in_mandel(double x0, double y0, int n) {
    double x=0,y=0,xtemp;
    while (n > 0) {
        xtemp = x*x - y*y + x0;
        y = 2*x*y + y0;
        x = xtemp;
        n -= 1;
        if (x*x + y*y > 4) return 0;
    }
    return 1;
}

/* Divide two numbers */
int divide(int a, int b, int *remainder) {
    int quot = a / b;
    *remainder = a % b;
    return quot;
}

/* Average values in an array */
double avg(double *a, int n) {
    int i;
    double total = 0.0;
    for (i = 0; i < n; i++) {
        total += a[i];
    }
    return total / n;
}

/* Function involving a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值