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...