Python 调用C语言DLL库函数

      今天通过一个实例和大家分享一下Python调用C语言DLL的简单调用过程,希望对大家有所帮助和启发。我的程序编译运行环境简单说明一下,本文介绍的C程序使用mingw下使用gcc编译运行,Python使用windows下安装的Python3.9版本。本次分享实例中的程序文件及编译的库文件、可执行程序文件如下图所示:

 

        首先,我们来编写一个简单的C程序add.c,并将其编译为一个dll库,这个小程序我们来实现两个函数,分别实现整型数(int)和符点型数(float)的相加。程序如下:

#include <stdio.h>

__declspec(dllexport) int addint(int a, int b);
__declspec(dllexport) float addfloat(float a, float b);
int addint(int, int);
float addfloat(float, float);
int addint (int num1,int num2)
{
    return num1 + num2;
}
float addfloat(float num1, float num2)
{
    return num1 + num2 ;
}

使用下面的语句将其编译成一个dll,执行后生成testadd.dll和testadd.lib文件。

gcc -shared -Wl,--out-implib,testadd.lib -o testadd.dll -fPIC add.c

        下面,编写一个C语言程序,验证库文件没有问题,可以正常使用,代码如下:

__declspec(dllimport) int __stdcall addint(int a, int b);
//__declspec(dllimport) 导入包
// 静态调用DLL库
int main()
{
    HMODULE h = NULL;//创建一个句柄h
    h = LoadLibrary("testadd.dll");
    if (h == NULL)//检测是否加载dll成功
    {
        printf("加载testadd.dll动态库失败\n");
        return -1;
    }


    typedef int(*AddFunc)(int, int); // 定义函数指针类型
    AddFunc add;
    // 导出函数地址
    add = (AddFunc)GetProcAddress(h, "add");

    int sum = addint(10, 20);
    printf("静态调用,sum = %d\n", sum);
}

使用gcc将其编译生成可执行文件cadd.exe。

mingw中在程序所在目录执行以下命令,可以看到程序正常返回10+20的执行结果:

$ ./cadd.exe
静态调用,sum = 30

       现在,我们来编辑一个python程序,用来调用刚刚编译好的testadd.dll,这里注意要用到ctypes库,代码如下:

from ctypes import *

#load the shared object file
adder = CDLL('testadd.dll', winmode=0)
#Find sum of integers
res_int = adder.addint (8,10)
print("sum of 8 and 10 = " + str(res_int))
#Find sum of floats
a = c_float(6.5)
b= c_float(9.8)
add_float = adder.addfloat
add_float.restype = c_float
print('sum of 6.5 and 9.8 =%.2f'%add_float(a, b))

          最后,运行以上代码,执行结果如下:

        至此,我们已经成功完成Python对C语言库的调用,你学会了吗?希望简单的分享对大家有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

urhero

一切源于您的鼓励与支持,谢谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值