python调用c语言的库(动态库DLL)

@真开心啊,聚精会神找一天错误没找到,看个视频摸摸鱼就找到了

首先要明确的怎么导入

项目所需,需要使用pyqt写界面,然后里有涉及电机和摄像头的调用,底层驱动是c语言写好了,并导出了动态库dll文件。

导入方法

可以使用ctypescffi方法导入,不过好像资料都不多
我用的是ctypes
在python代码的头部导入库

import ctypes
from ctypes import *
AMC = ctypes.cdll.LoadLibrary
lib_amc = AMC("./driver/amc4030/AMC4030.dll") #该文件与python在同一目录下
print("add AMC4030.dll succeed")

一般这样就把动态链接库导入进去了。假设库里有一个函数,名字是

function(int a, int b)

然后开始调用库里的函数

lib_amc.function(1,2)

参数类型怎么匹配

上面这个都是很简单的导入和调用方法,但是我们主要出现的问题是参数类型不匹配。比如报错

TypeError: an integer is required (got type str

比如我dll库里有一个函数原型是

#define temp_SYSTEM 0
···
temp_GetInt( void* ; const wchar_t* , long long* ); //这是原形

temp_GetInt(a, L"count", &temp_count);//调用一般都是这样,里面涉及了长字符串,指针,void*

是不是在python里调用就蒙了。。。
众所周知,L"count", 这样count的类型是长字符串型。也就是wchar_t。后面的&temp_count,也就是一个长整型取地址
ctypes就是做这个类型转换的,这个时候就需要一个c类型和python类型对应成ctypes的表了
也就是你在python代码里用ctypes类型代替c语言里有但是python里没有的类型,比如指针是吧。

ctypes基本C兼容数据类型对应表

ctypes 类型c类型python 类型
c_bool_Boolbool (1)
c_charchar1-character bytes object
c_wcharwchar_t1-character string
c_bytecharint
c_ubyteunsigned charint
c_shortshortint
c_ushortunsigned shortint
c_intintint
c_uintunsigned intint
c_longlongint
c_ulongunsigned longint
c_longlong__int64 or long longint
c_ulonglongunsigned __int64 or unsigned long longint
c_size_tsize_tint
c_ssize_tssize_t or Py_ssize_tint
c_floatfloatfloat
c_doubledoublefloat
c_longdoublelong doublefloat
c_char_pchar * (NUL terminated)bytes object or None
c_wchar_pwchar_t * (NUL terminated)string or None
c_void_pvoid *int or None

上面这个表就是对应了python里的怎么改C库数据类型

指针怎么改

指针的改法如下
给他加个byref

最后这么调用的

FX = ctypes.cdll.LoadLibrary
lib_fx = FX("./driver/fx17/SpecSensor.dll")
nDeviceCount = 0
c_nDeviceCount = c_longlong(nDeviceCount)
lib_fx.SI_GetInt(0, c_wchar_p('DeviceCount'), byref(c_nDeviceCount))
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值