【pycharm】python调用DLL

【pycharm】python调用DLL–指针

使用pycharm用python调用C生成的动态链接库(DLL)

Step1:调用DLL

通常使用内置ctypes模块完成DLL中c变量类型与python变量类型的对应。确认DLL所在地址后使用cdll.LoadLibrary(dll所在地址)完成DLL的加载。

# -*- coding:utf-8 -*-
#
# Author:LucXiong
#
import ctypes
from ctypes import *


address = 'C:\\Users\\HUAWEI\\Documents\CSDN\\codeblocks生成dll并调用\\forCSDNdll\\bin\Debug\\forCSDNdll.dll'
dll = cdll.LoadLibrary(address)

Step2:调用DLL

Step2.1:调用DLL内无指针函数

首先,将dll内函数赋给add1
然后,通过.argtypes = [数据类型]与dll内已写好的函数输入参数类型对应,通过.restype =与与dll内已写好的函数返回参数类型对应。此处dll内函数具体定义代码见【codeblocks】C生成并调用DLL

// dll内无指针函数
int add1(int a, int b)
{
    int c;
    c = a + b;
    return c;
}
# python调用无指针函数
add1 = dll.add1
add1.argtypes = [c_int,c_int]
add1.restype = c_int
t1 = 23
t2 = 24
x = add1(t1,t2)
print(x) # 47
print(type(x)) # <class 'int'>

最后,即可直接由add1(t1,t2)完成dll内函数的调用。输出数据也为python的int类型。

Step2.2:调用DLL内返回为指针数组的函数

首先,将dll内函数赋给add2
然后,通过.argtypes = [数据类型]与dll内已写好的函数输入参数类型对应,通过.restype =与与dll内已写好的函数返回参数类型对应。非字符串指针的对应通过POINTER(c_float)POINTER(c_int)完成对应,具体各数据类型的对应关系见参考资料[4]python ctypes模块中变量与c对应关系。此处dll内函数具体定义代码见【codeblocks】C生成并调用DLL

// ddl内入参浮点,返回指针数组的函数
float *add2(float a, float b)
{
    static float c[2];
    c[0] = a + b;
    c[1] = c[0] + 1;
    return c;
}
# python调用dll内入参浮点,返回指针数组的函数
add2 = dll.add2
add2.argtypes = [c_float,c_float]
add2.restype = POINTER(c_float)
t1 = 23
t2 = 24
y = add2(t1,t2)
print(y) # <__main__.LP_c_float object at 0x045A6D00>
print(type(y)) # <class '__main__.LP_c_float'>
print(y[0]) # 47.0
print(type(y[0])) # <class 'float'>

最后,即可直接由add2(t1,t2)完成dll内函数的调用。但是由于返回为指针,所以看到输出为print(y) # <__main__.LP_c_float object at 0x045A6D00>,数据类型是<class '__main__.LP_c_float'>,根据指针数组与python列表的相似性,直接通过y[0]即可取出原dll指针数组中的值。

Step2.3:调用DLL

首先,将dll内函数赋给add3
然后,通过.argtypes = [数据类型]与dll内已写好的函数输入参数类型对应(即使入参为一个参数,也需要用[]标记),通过.restype =与与dll内已写好的函数返回参数类型对应。非字符串指针的对应通过POINTER(c_float)POINTER(c_int)完成对应,具体各数据类型的对应关系见参考资料[4]python ctypes模块中变量与c对应关系。此处dll内函数具体定义代码见【codeblocks】C生成并调用DLL

// dll内入参指针数组,返回浮点的函数
float add3(float *arr)
{
    float c;
    c = arr[0] + arr[1];
	return c;
}
# python调用dll内入参指针数组,返回浮点的函数
add3 = dll.add3
add3.argtypes = [POINTER(c_float)]
add3.restype = c_float
t1 = 23
t2 = 24
t = (c_float*2)(*[t1,t2]) # important!
# print(type(t))
# cast(t,POINTER(c_float))
# print(type(t))
z = add3(t)
print(z) # 47.0
print(type(z)) # <class 'float'>

第三步,在通过add3(t)调用函数dll内函数之前,需要将输入参数对应的某一数组(python里 的列表)转化成符合要求的指针数组(即上述代码第7行)(c_float*2)(*[t1,t2])(c数据类型*列表长度)(*列表)。最后即可直接由add3(t)完成dll内函数的调用。具体见参考资料[3] python调用dll第三篇:python调用dll代码编写运行

参考资料

[1] python DLL文件调用问题
[2] Python ctypes 使用总结
[3] python调用dll第三篇:python调用dll代码编写运行
[4] python ctypes模块中变量与c对应关系
如有侵权,请发送邮件至lxiong13@outlook.com联系我!Merci beaucoup!

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

LucXiong

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值