用python ctypes呼叫動態鏈結庫

2021-06-09 15:24:38 字數 1500 閱讀 8280

ctypes is very cool! great piece of work.

- just van rossum

ctypes使得python能夠直接呼叫c語言開發的動態鏈結庫,非常強大。

為了使用ctypes,你必須依次完成以下步驟:

* 編寫動態連線庫程式

* 載入動態連線庫

* 將python的物件轉換為ctypes所能識別的引數

* 使用ctypes的引數呼叫動態連線庫中的函式

來個簡單的例項吧:

1. 編寫動態鏈結庫

c**  

// filename: foo.c

#include 

char* myprint(char *str)  

float add(float a, float b)    

shell**  

gcc -fpic -shared foo.c -o foo.so  

2. ctypes呼叫

python**  

#!/usr/bin/env python

# filename: foo.py

from ctypes import *  

foo = cdll('./foo.so')  

myprint = foo.myprint  

myprint.argtypes = [pointer(c_char)] # 引數型別,為char指標

myprint.restype = c_char_p # 返回型別,同樣為char指標

res = myprint('hello')  

print res  

add = foo.add  

add.argtypes = [c_float, c_float] # 引數型別,兩個float(c_float內ctypes型別)

add.restype = c_float  

print add(1.3, 4.2)  

文件請參考

3. 查詢鏈結庫

python**  

>>> from ctypes.util import find_library  

>>> find_library("m")  

'libm.so.6'

>>> find_library("c")  

'libc.so.6'

>>> find_library("bz2")  

'libbz2.so.1.0'

>>>  

呼叫libc裡的printf:

python**  

#filename: printf_example.py

import ctypes  

from ctypes.util import find_library  

printf = ctypes.cdll(find_library("c")).printf  

printf("hello, world\n") 

python ctypes呼叫c函式傳入二維陣列

python呼叫c,顯然你要有兩個檔案,乙個.c,乙個.py。使其在同一工作目錄下。在你的c檔案中寫入這些。前面的是給msvc看的。include ifdef msc ver define dll export declspec dllexport else define dll export en...

python ctypes庫4 如何傳遞乙個字串

關鍵點是理解char和char char ptr 2 ab 等價於 char arr 2 char ptr 1 arr 傳遞乙個字串並返回該字串 test string dllexport char stdcall test str char str ptr 對應c test str import ...

qt呼叫import sys庫 用qt呼叫第三方庫

宣告 事先我已經自己動手寫了乙個簡單的dll檔案 mydll.dll c版介面的。並且用我前兩篇有關dll文章裡面的方法,從dll中匯出了導入庫 lib 檔案,dll中有兩個函式,原型如下 void helloworld 函式內部呼叫win32 api,功能是彈出乙個helloworld提示框 in...