日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

ctypes python_Python ctypes 使用总结

發布時間:2024/9/15 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ctypes python_Python ctypes 使用总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python 調用 C/C++ 的程序主要有兩種方式:

使用 ctypes 調用動態庫

ctypes 的方式相對來說成本較低,首先 ctypes 是內置庫,使用方便,使用的過程中與 C/C++ 動態庫的邏輯是完全獨立的,互相可以單獨維護。但是相對也有明顯的缺點,C++ 在編譯后的函數名會變,ctypes 使用起來不方便,API 相對也比較繁瑣,寫起來略微麻煩一些,使用出錯的話會導致進程退出。

本文主要介紹 ctypes 的基本用法,可以對現有的 C/C++ 代碼進行簡單的二次封裝后進行使用。筆者認為 ctypes 本身還是比較適合輕量級的使用場景,如果邏輯較為復雜的,請考慮使用 C/C++ 擴展的方式。

本文的 Python 以 2.7 版本為例,編譯使用 gcc。

簡單示例

寫一個簡單的 Hello 來說明一下最基本的用法。首先定義一個簡單的 c 函數。

//hello_module.c

#include

int hello(const char* name) {

printf("hello %s!\n", name);

return 0;

}

編譯生成動態庫,動態庫不同的系統后綴不同(Windows 的 dll,Linux 的 so,Mac 的 dylib),需要注意,本文以 so 為例。

gcc -fPIC -shared hello_module.c -o hello_module.so

通過 ctypes 來進行動態庫加載及函數調用,注意 windows 的調用方式有專有的 API。

import ctypes

lib = ctypes.cdll.LoadLibrary("hello_module.so")

lib.hello("world") # hello world!

以上便是簡單的 ctypes 使用流程,加載動態庫,然后就可以調用動態庫中的函數。

有幾點需要注意的地方:

類型的隱私轉換的,python 的 str 轉換為了 c 的 const char*

默認的函數返回值認為是 int,不為 int 的需要自行修改

函數的參數類型未指定,只能使用 ctypes 自帶的類型隱私轉換

基礎類型可以參考官方文檔的對應表格,需要額外說明的一點是,int 和 uint 都有對應的 8、16、32、64 的類型可供使用。

數組和指針類型

基本類型中只包含了 c_char_p 和 c_void_p 兩個指針類型,其他的指針類型該如何使用?數組該如何定義和使用?我們來看看這兩個類型的使用。

編寫一個為數組求和的函數。

//sum_module.c

#include

int sum(int a[], size_t len) {

int ret = 0;

for (size_t i = 0; i < len; i++) {

ret += a[i];

}

return ret;

}

int sum2(int* a, size_t len) {

int ret = 0;

for (size_t i = 0; i < len; i++) {

ret += a[i];

}

return ret;

}

和上面一樣進行編譯,生成動態庫

gcc -fPIC -shared sum_module.c -o sum_module.so

像之前一樣來使用,看下會怎樣。

import ctypes

lib = ctypes.cdll.LoadLibrary("sum_module.so")

lib.sum([1, 2, 3], 3)

#Traceback (most recent call last):

# File "demo.py", line 7, in

# lib.sum([1, 2, 3], 3)

#ctypes.ArgumentError: argument 1: : Don't know how to convert parameter 1

會發現 ctypes 報錯了,不知道類型如何進行轉換,也就是說 ctypes 的隱式轉換是不支持數組類型的。

我們需要用 ctypes 的數組來傳參數。

import ctypes

lib = ctypes.cdll.LoadLibrary("sum_module.so")

array = (ctypes.c_int * 3)(1, 2, 3)

print lib.sum(array, len(array))

i = ctypes.c_int(5)

print lib.sum(i, 1)

ctypes 的數組定義就是用 ctypes 中的類型 * 大小。

下面我們看一下指針的用法。

import ctypes

lib = ctypes.cdll.LoadLibrary("sum_module.so")

i = ctypes.c_int(5)

lib.sum2.argtypes = (ctypes.POINTER(ctypes.c_int), ctypes.c_size_t)

print lib.sum2(ctypes.pointer(i), 1)

POINTER 是用來定義指針類型,pointer 用來獲取一個變量的指針,相當于 C 里面的 &。

pointer 的用法需要注意的是,必須在 ctypes 類型上使用,不能在 python 類型上使用。

import ctypes

i = ctypes.c_int(5)

print ctypes.pointer(i) # <__main__.LP_c_int object at 0x10566f7a0>

i = 5

print ctypes.pointer(i) # TypeError: _type_ must have storage info

這就是數組和指針的基本使用方式,注意指針和數組的區分,這里定義的 sum 和 sum2 只是舉例,sum2 第一個參數也可以接受數組,這個和在 C 里面是一樣的。

函數參數類型和返回值類型

之前的例子只有一個明確指定了參數類型,沒有指定返回類型。返回類型默認是 int,如果需要返回非 int 的類型就需要進行指定。

指定參數類型的好處在于,ctypes 可以處理指針的轉換,無需代碼中進行轉換。

繼續使用上一個 sum2 函數為例。

i = ctypes.c_int(5)

lib.sum2.argtypes = (ctypes.POINTER(ctypes.c_int), ctypes.c_size_t)

print lib.sum2(ctypes.pointer(i), 1)

print lib.sum2(i, 1)

可以使用 pointer(i) 和 i 作為 sum2 的第一個參數,會自動處理是否為指針的情況。

結構體

結構體在 ctypes 需要進行類的定義,類型和指針的使用方式和之前一致。

下面我們看一個 struct 定義的實例。

import ctypes

"""

typedef struct _user {

int type;

uint64_t userid;

char username[64];

unsigned int created_at;

} user;

"""

class User(ctypes.Structure):

_fields_ = [

('type', ctypes.c_int),

('userid', ctypes.c_uint64),

('username', ctypes.c_char * 64),

('created_at', ctypes.c_uint),

]

print ctypes.POINTER(User) # u = User()

print ctypes.pointer(u) # <__main__.LP_User object at 0x10982c7a0>

總結

ctypes 也支持聯合體 union,但是因為不常用,所以本文沒有提及。有需要的可以參考官方文檔。

參考資料

總結

以上是生活随笔為你收集整理的ctypes python_Python ctypes 使用总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 神马午夜久久 | 一区二区三区久久 | 欧美成人专区 | 妺妺窝人体色www聚色窝仙踪 | 在线啪| 亚洲欧美一区二区三区四区 | 午夜一级片 | 天堂福利视频 | 黄色成人在线免费观看 | 999在线视频 | 久久夜色精品亚洲 | jlzzjlzzjlzz亚洲人 | 日韩一级在线观看 | 欧美久久久影院 | 自由 日本语 热 亚洲人 | 97久草| 自拍第二页 | 日本黄色三级视频 | 黄色1级片 | 国产一区在线免费 | 日韩欧美高清在线 | 国产成人精品777777 | 天天综合中文字幕 | 亚洲无码国产精品 | 色视频网址| 自拍偷拍2019 | 欧美性生交大片免费看 | 99riav在线 | 99久久婷婷国产一区二区三区 | 97在线免费视频观看 | 一级黄色性片 | 天堂二区 | 日韩欧美国产三级 | 日韩爱爱视频 | 毛茸茸free性熟hd | 综合久久91 | 在线看av的网址 | 日本少妇吞精囗交 | 国产日本欧美在线 | 日韩黄色一级大片 | 级毛片内射视频 | www.在线看 | jizzjizz日本免费视频 | 国产探花一区 | 在线色站 | 岛国片在线播放 | 丰满岳妇伦在线播放 | 91网站在线播放 | 在线手机av | 九九热中文字幕 | 在线国产一区 | www.com久久| 亚洲欧美综合色 | 色噜噜狠狠狠综合曰曰曰 | 美女被草出水 | 欧产日产国产精品98 | 免费观看一区 | 亚洲青青操 | 欧美一级性视频 | 亚洲一区二区美女 | 99热9| 精品免费视频一区二区 | 日韩高清三区 | 国产精品女人久久久 | 羞羞网站在线观看 | 麻豆视频免费在线 | 中文婷婷| 成人欧美一区二区三区黑人 | 男女av| 国产手机av | 台湾少妇xxxx做受 | 国产女人18水真多18精品一级做 | 五月天一区二区 | 波多野结衣av中文字幕 | 激情婷婷六月 | 天躁夜夜躁狼狠躁 | 中文字幕乱码视频 | 一级精品视频 | 久久伊人中文字幕 | 一卡二卡在线视频 | 99久久精品国产亚洲 | av网站免费在线看 | 亚洲国产成人精品久久 | 97干干 | 91视频影院| 黄页网址大全免费观看 | a人片 | 中文在线字幕观看 | 超碰免费在线97 | 日韩av一区二区三区 | 窝窝午夜视频 | 国产精品人人妻人人爽人人牛 | 91免费短视频| 一级片毛片 | 婷婷俺来也 | 国产亚洲综合在线 | 国产一精品一aⅴ一免费 | www.久久久.com | 国产91在线精品 |