python 调用c接口

简介: 【10月更文挑战第12天】 ctypes是Python的一个外部库,提供和C语言兼容的数据类型,可以很方便地调用C DLL中的函数

注意调用ctypes时的名字冲突问题

ctypes是Python的一个外部库,提供和C语言兼容的数据类型,可以很方便地调用C DLL中的函数。

  1. ctypes基本数据类型映射表
    参数类型预先设定好,或者在调用函数时再把参数转成相应的c_*类型。ctypes的类型对应如下:
ctypes type C type Python Type
c_char char 1-character string 2 c_wchar wchar_t 1-character unicode string 3 c_byte char int/long

4 | c_ubyte | unsigned char | int/long |
5 | c_bool | bool | bool |
6 | c_short | short | int/long |
7 | c_ushort | unsigned short | int/long |
8 | c_int | int | int/long |
9 | c_uint | unsigned int | int/long |
10 | c_long | long | int/long |
11 | c_ulong | unsigned long | int/long |
12 | c_longlong | int64 or longlong | int/long |
13 | c_ulonglong | unsigned
int64 or unsigned long long| int/long |
14 | c_float | float | float |
15 | c_double | double | float |
16 | c_longdouble| long double float | float |
17 | c_char_p | char | string or None |
18 | c_wchar_p | wchar_t
| unicode or None |
19 | c_void_p | void * | int/long or None |

  1. 加载DLL

访问dll,首先需引入ctypes库
from ctypes import *
假设你已经有了一个的DLL(名字是add.dll),且该DLL有一个符合cdecl(这里强调调用约定是因为,stdcall调用约定和cdecl调用约定声明的导出函数,在使用python加载时使用的加载函数是不同的,后面会有说明)调用约定的导出函数Add。
stdcall调用约定:两种加载方式

Objdll = ctypes.windll.LoadLibrary("dllpath")
Objdll = ctypes.WinDLL("dllpath")

cdecl调用约定:也有两种加载方式

Objdll = ctypes.cdll.LoadLibrary("dllpath")
Objdll = ctypes.CDLL("dllpath")

其实windll和cdll分别是WinDLL类和CDll类的对象。

  1. 指针与引用

常用的通过调用ctypes类型的指针函数来创建指针实例:

from ctype import *
i = c_int(1)
pi = POINTER(i)

对指针实例赋值只会改变其指向的内存地址,而不是改变内存的内容,与其他语言类似,如需要可改变内容的字符串,可须使用create_string_buffer()

p = create_string_buffer("Hello", 10) # create a 10 byte buffer
print sizeof(p), repr(p.raw)

10 'Hello/x00/x00/x00/x00/x00'

不带参数的调用指针类型创建一个NULL指针, NULL指针有一个False布尔值

null_ptr = POINTER(c_int)()
print bool(null_ptr)

False

指针实例有一个contents属性,返回这个指针所指向的对象。
另外,byref()是用来传递引用参数,pointer()作为传参通常会创建一个实际的指针对象,当不需要实际指针对象时,则可使用byref()

  1. 结构体类型处理

Structures和Unions必须继承Structure和Union基础类,它们都在ctypes模块中定义,每一个子类必须定义个 fields属性,fields是一个二维的tuples列表,包含着每个field的name及type,这field类型必须是一个 ctypes类型,如c_int,或者任何其他的继承ctypes的类型,如Structure, Union, Array, 指针等。
例如有一个简单结构,包含两个整型x和y,可如下初始化一个结构:

from ctypes import *
import types
class Test(Structure):
    _fields_ = [('x', c_int),
                ('y', c_char)]
test1 = Test(1, 2)

另外,如结构体用于链表操作,即包含指向结构体指针时,若直接定义:

from ctypes import *
import types
class Test(Structure):
    _fields_ = [('x', c_int),
                ('y', c_char),
                ('next', Test)]

则python会报错type未定义

from ctypes import *
import types
class Test(Structure):
    pass
Test._fields_ = [('x', c_int),
                ('y', c_char),
                ('next', POINTER(Test))]
  1. 数组定义

数组包含一个固定数目的相同类型的实例,常用创建数组类型是对一个数据类型与一个正数相乘,例如:

ArrayType = Test * 10

初始化和使用数组:

from ctypes import *
TenIntegers = c_int * 10
ii = TenIntegers(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
print ii
<c_long_Array_10 object at 0x...>
for i in ii:
    print i,
相关文章
|
9月前
|
缓存 自然语言处理 监控
阿里巴巴 item_review 接口深度分析及 Python 实现
阿里巴巴开放平台的 item_review 接口用于获取商品用户评论数据,支持评论内容、评分、买家信息等多维度分析,助力产品优化与市场策略制定。
|
9月前
|
缓存 监控 算法
item_get - Lazada 商品详情详情接口深度分析及 Python 实现
Lazada商品详情接口item_get可获取商品全维度数据,包括价格、库存、SKU、促销及卖家信息,支持东南亚六国站点,适用于竞品监控、定价策略与市场分析,助力跨境卖家精准决策。
|
8月前
|
JSON API 数据安全/隐私保护
Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
|
9月前
|
JSON 监控 数据格式
1688 item_search_app 关键字搜索商品接口深度分析及 Python 实现
1688开放平台item_search_app接口专为移动端优化,支持关键词搜索、多维度筛选与排序,可获取商品详情及供应商信息,适用于货源采集、价格监控与竞品分析,助力采购决策。
|
9月前
|
缓存 供应链 监控
VVIC seller_search 排行榜搜索接口深度分析及 Python 实现
VVIC搜款网seller_search接口提供服装批发市场的商品及商家排行榜数据,涵盖热销榜、销量排名、类目趋势等,支持多维度筛选与数据分析,助力选品决策、竞品分析与市场预测,为服装供应链提供有力数据支撑。
|
9月前
|
缓存 监控 算法
唯品会item_search - 按关键字搜索 VIP 商品接口深度分析及 Python 实现
唯品会item_search接口支持通过关键词、分类、价格等条件检索商品,广泛应用于电商数据分析、竞品监控与市场调研。结合Python可实现搜索、分析、可视化及数据导出,助力精准决策。
|
9月前
|
缓存 监控 算法
苏宁item_get - 获得商品详情接口深度# 深度分析及 Python 实现
苏宁易购item_get接口可实时获取商品价格、库存、促销等详情,支持电商数据分析与竞品监控。需认证接入,遵守调用限制,适用于价格监控、销售分析等场景,助力精准营销决策。(238字)
|
9月前
|
监控 算法 数据安全/隐私保护
唯品会 item_get - 获得 VIP 商品详情接口深度分析及 Python 实现
唯品会item_get接口通过商品ID获取商品详情,支持价格、库存、促销等数据抓取,适用于电商分析、竞品监控与价格追踪,结合Python实现可高效完成数据获取、分析与可视化,助力精准营销决策。

推荐镜像

更多