【pycharm】python调用DLL
- 【pycharm】python调用DLL--指针
- Step1:调用DLL
- Step2:调用DLL
- Step2.1:调用DLL内无指针函数
- Step2.2:调用DLL内返回为指针数组的函数
- Step2.3:调用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内无指针函数
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)
完成对应
// 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)
完成对应
// 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内函数的调用。
参考资料
Python ctypes 使用总结 如有侵权,联系我!