最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中ctypes使用方法

 更新時間:2024年04月24日 11:36:49   作者:平時不搬磚  
這篇文章主要介紹了python中ctypes使用方法,包括 python和c中類型映射,操作結(jié)構(gòu)體和聯(lián)合體,需要定義結(jié)構(gòu)體或聯(lián)合體的類型,然后可以創(chuàng)建實例、訪問其成員等,感興趣的朋友跟隨小編一起看看吧

前段時間接到了一個需求是給一個藍(lán)牙的SDK測試接口的穩(wěn)定性,將SDK的接口文檔給你了,需要每個接口都寫一個對應(yīng)的測試用例,SDK 是用c寫的,而我python用的比較熟練些,所有記錄下在ctypes庫的使用方法。

1 python和c中類型映射

ctypes中數(shù)據(jù)類型

ctypes 類型C 類型Python 數(shù)據(jù)類型
c_bool_Boolbool (1)
c_charchar單字符字節(jié)串對象
c_wcharwchar_t單字符字符串
c_bytecharint
c_ubyteunsigned charint
POINTER(c_ubyte)uchar*int
c_shortshortint
c_ushortunsigned shortint
c_intintint
c_uintunsigned intint
c_longlongint
c_ulongunsigned longint
c_longlong__int64 或 long longint
c_ulonglongunsigned __int64 或 unsigned long longint
c_size_tsize_tint
c_ssize_tssize_t 或 Py_ssize_tint
c_floatfloatfloat
c_doubledoublefloat
c_longdoublelong doublefloat
c_char_pchar * (NUL terminated)字節(jié)串對象或 None
c_wchar_pwchar_t * (NUL terminated)字符串或 None
c_void_pvoid *int 或 None

2 加載共享庫

import ctypes  
# 加載本地的共享庫,路徑根據(jù)實際情況調(diào)整  
lib = ctypes.CDLL('./libexample.so')  # Linux/macOS平臺  
# lib = ctypes.WinDLL('example.dll')  # Windows平臺

3 調(diào)用函數(shù)

# 設(shè)置參數(shù)類型  
lib.add.argtypes = [ctypes.c_int, ctypes.c_int]  
# 設(shè)置返回類型  
lib.add.restype = ctypes.c_int  
# 調(diào)用C函數(shù)  
result = lib.add(2, 3)  
print(result)  # 輸出:5

4 操作指針

在ctypes中,你可以使用pointer和byref來操作指針。

# 創(chuàng)建一個整數(shù)數(shù)組  
arr = (ctypes.c_int * 5)(1, 2, 3, 4, 5)  
# 獲取指向數(shù)組首元素的指針  
ptr = ctypes.pointer(arr)  
# 通過指針訪問數(shù)組元素  
print(ptr[0])  # 輸出:1  
# 使用byref創(chuàng)建指向變量的指針  
x = ctypes.c_int(10)  
px = ctypes.byref(x)  
# 通過指針修改變量的值  
lib.increment(px)  # 假設(shè)有一個increment函數(shù)用于增加整數(shù)的值  
print(x.value)  # 輸出:11
# 調(diào)用系統(tǒng)的庫函數(shù)測試
from ctypes import c_int, c_float, create_string_buffer, CDLL, byref
c_lib = CDLL('/lib/x86_64-linux-gnu/libc.so.6')
i = c_int()
f = c_float()
s = create_string_buffer(b"\000" * 32)
print(i.value, f.value, repr(s.value))
# brref 傳入數(shù)據(jù)類型返回指針的地址, create_string_buffer返回的是指針
c_lib.sscanf(b"1 3.14 Hello", b"%d %f %s", byref(i), byref(f), s)
print(i.value, f.value, repr(s.value))
from ctypes import c_int, POINTER, cdll
i = c_int(42)   # 創(chuàng)建一個int類型變量
pi = POINTER(c_int)(i)  # 定義一個指向int類型的指針
print(pi.contents)   # 打印指針指向的內(nèi)存地址
print(pi.contents.value)   # 打印指針指向的值
# 定義C庫中的函數(shù)原型
sum_func = cdll.LoadLibrary('./test1.so').sums
sum_func.argtypes = [POINTER(c_int), POINTER(c_int)]    # 定義函數(shù)參數(shù)類型為指針類型
sum_func.restype = POINTER(c_int)   # 定義函數(shù)返回值類型為指針類型
pointer = POINTER(c_int)
# 調(diào)用sum()函數(shù)
a = c_int(1)
b = c_int(2)
c = sum_func(pointer(a), pointer(b))   # 將a、b的地址傳遞給sum()函數(shù)
print(c.contents.value)   # 打印返回值

5 操作結(jié)構(gòu)體和聯(lián)合體

你需要定義結(jié)構(gòu)體或聯(lián)合體的類型,然后可以創(chuàng)建實例、訪問其成員等。

# 定義C語言的結(jié)構(gòu)體類型  
class Point(ctypes.Structure):  
    _fields_ = [("x", ctypes.c_int), ("y", ctypes.c_int)]  
# 創(chuàng)建結(jié)構(gòu)體的實例  
p = Point()  
p.x = 10  
p.y = 20  
# 將結(jié)構(gòu)體的實例傳遞給C函數(shù)  
lib.print_point(p)  # 假設(shè)有一個print_point函數(shù)用于打印點的坐標(biāo)

6 處理字符串

字符串通常以字符數(shù)組或字符指針的形式存在。在ctypes中,你可以使用create_string_buffer來創(chuàng)建C風(fēng)格的字符串,或者使用c_char_p來操作字符串指針。

# 創(chuàng)建C風(fēng)格的字符串  
c_str = ctypes.create_string_buffer(b"Hello, World!")  
# 將字符串傳遞給C函數(shù)  
lib.print_string(c_str)  # 假設(shè)有一個print_string函數(shù)用于打印字符串  
# 處理C語言中的字符串指針  
c_char_p_type = ctypes.POINTER(ctypes.c_char)  
c_char_p = c_char_p_type.from_buffer(c_str)  
lib.print_string_ptr(c_char_p)  # 假設(shè)有一個print_string_ptr函數(shù)接收字符串指針

7 回調(diào)函數(shù)

c 中很多實現(xiàn)異步的方式通過回調(diào)函數(shù)事件觸發(fā)的方式,ctype中也能將ctype定義的函數(shù)傳入c中執(zhí)行

# include "stdio.h"
typedef int (*CallbackFunc)(int, int);
int c_sub(int x, int y){
    printf("c callback func\n");
    return x - y;
}
void call_callback(CallbackFunc callback){
    int result = callback(3, 4);
    printf("result from c: %d\n", result);
}
import ctypes
my_lib = ctypes.CDLL("./test2.so")
callback_type = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int, ctypes.c_int)
def python_sub(a, b):
    print("python callback func")
    return b - a
# 1.調(diào)用c中的函數(shù),回調(diào)函數(shù)從python中傳入
python_callback = callback_type(python_sub)
my_lib.call_callback(python_callback)
# 2.調(diào)用c中的函數(shù),回調(diào)從c中傳入
c_callback = callback_type(my_lib.c_sub)
my_lib.call_callback(c_callback)

到此這篇關(guān)于python中ctypes使用的文章就介紹到這了,更多相關(guān)python ctypes使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python全局變量關(guān)鍵字global的簡單使用

    Python全局變量關(guān)鍵字global的簡單使用

    python中g(shù)lobal關(guān)鍵字主要作用是聲明變量的作用域,下面這篇文章主要給大家介紹了關(guān)于Python全局變量關(guān)鍵字global的簡單使用,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 使用python查找windows系統(tǒng)中所有程序的安裝信息

    使用python查找windows系統(tǒng)中所有程序的安裝信息

    這篇文章主要為大家介紹了使用python查找windows系統(tǒng)中所有程序的安裝信息示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • python實現(xiàn)簡單ftp客戶端的方法

    python實現(xiàn)簡單ftp客戶端的方法

    這篇文章主要介紹了python實現(xiàn)簡單ftp客戶端的方法,涉及ftplib模塊的相關(guān)使用技巧,需要的朋友可以參考下
    2015-06-06
  • Python基于隨機采樣一至性實現(xiàn)擬合橢圓(優(yōu)化版)

    Python基于隨機采樣一至性實現(xiàn)擬合橢圓(優(yōu)化版)

    這篇文章主要對上一版的Python基于隨機采樣一至性實現(xiàn)擬合橢圓的優(yōu)化,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的可以了解一下
    2022-11-11
  • Django使用詳解:ORM 的反向查找(related_name)

    Django使用詳解:ORM 的反向查找(related_name)

    今天小編就為大家分享一篇Django使用詳解:ORM 的反向查找(related_name),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python學(xué)習(xí)筆記之讀取文件、OS模塊、異常處理、with as語法示例

    Python學(xué)習(xí)筆記之讀取文件、OS模塊、異常處理、with as語法示例

    這篇文章主要介紹了Python學(xué)習(xí)筆記之讀取文件、OS模塊、異常處理、with as語法,結(jié)合實例形式簡單分析了Python針對文件、目錄的讀取、異常處理等相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06
  • 深入詳解Python解析帶有命名空間XML的多種方法

    深入詳解Python解析帶有命名空間XML的多種方法

    XML命名空間是XML技術(shù)中??不可或缺??的重要組成部分,它通過提供元素和屬性的唯一標(biāo)識,本文將深入探討Python中解析帶有命名空間的XML文檔的各種方法和技術(shù),希望對大家有所幫助
    2025-09-09
  • python實點云分割k-means(sklearn)詳解

    python實點云分割k-means(sklearn)詳解

    這篇文章主要為大家詳細(xì)介紹了Python實點云分割k-means,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Python如何自動生成環(huán)境依賴包requirements

    Python如何自動生成環(huán)境依賴包requirements

    這篇文章主要介紹了Python如何自動生成環(huán)境依賴包requirements問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 利用python繪制蜂群圖的示例代碼

    利用python繪制蜂群圖的示例代碼

    蜂群圖可以不重疊的顯示各數(shù)據(jù)點的分布,相對于散點圖,所繪制的點彼此靠近且不會重疊,能有效呈現(xiàn)出點分布的局部密度信息,本文給大家介紹了如何利用python繪制蜂群圖,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-03-03

最新評論

台中县| 绥中县| 阿合奇县| 杨浦区| 砚山县| 盐津县| 波密县| 清徐县| 怀来县| 徐汇区| 驻马店市| 沾益县| 涪陵区| 南和县| 喀喇| 广安市| 亚东县| 古蔺县| 丘北县| 南昌县| 灵台县| 海南省| 宁国市| 新晃| 奉贤区| 共和县| 潮安县| 吉木乃县| 鄱阳县| 银川市| 军事| 新民市| 松原市| 康马县| 当雄县| 甘德县| 廉江市| 泌阳县| 成武县| 郸城县| 大埔县|