python 與 c 的互動(ctypes庫使用)
ctypes是python的乙個外部庫,可以使用python語言呼叫已經編譯好的c語言函式以及資料型別並進行資料交換等。ctypes的官方文件在
1.生成c語言函式
#step 1: test.c
#include
int add(int a, int b)12
3456
782.編譯動態鏈結庫生成 libtest.so檔案(dll)
gcc -fpic -shared test.c -o libtest.so
13.呼叫dll檔案
#step 3: test.py
from ctypes import *
mylib = cdll("libtest.so") 或者 cdll.loadlibrary("libtest.so")
add = mylib.add
add.argtypes = [c_int, c_int] # 引數型別,兩個int(c_int是ctypes型別,見上表)
add.restype = c_int # 返回值型別,int (c_int 是ctypes型別,見上表)
sum = add(3, 6)12
3456
783.指標和引用
對指標例項賦值只會改變其指向的記憶體位址,而不是改變記憶體的內容。指標例項有乙個contents屬性,返回這個指標所指向的物件。
函式 說明
byref(x [, offset]) 返回 x 的位址,x 必須為 ctypes 型別的乙個例項。相當於 c 的 &x 。 offset 表示偏移量。
pointer(x) 建立並返回乙個指向 x 的指標例項, x 是乙個例項物件。
pointer(type) 返回乙個型別,這個型別是指向 type 型別的指標型別, type 是 ctypes 的乙個型別。
from ctype import *
i = c_int(1)
pi = pointer(c_int)(i)
pi2 = pointer(i)
print pi.contents #返回指標指向物件的值
print pi2.contents12
3456
pointer 和 pointer 的區別是,pointer 返回乙個例項,pointer 返回乙個型別。
4.結構型別資料
structures和unions必須繼承structure和union基礎類,它們都在ctypes模組中定義,每乙個子類必須定義個fields屬性,fields是乙個二維的tuples列表,包含著每個field的name及type,這field型別必須是乙個ctypes型別,如c_int,或者任何其他的繼承ctypes的型別,如structure, union, array, 指標等。
from ctypes import *
import types
class test(structure):
_fields_ = [('x', c_int),
('y', c_char)]
test1 = test(1, 2) 12
3456
如結構體用於鍊錶操作,即包含指向結構體指標時,則需如下定義
from ctypes import *
import types
class test(structure):
pass
test._fields_ = [('x', c_int),
('y', c_char),
('next', pointer(test))] 12
3456
7參考文獻:
1.
2.
3.
python與cad互動 python與C 互動
python和c 能進行有效的互動,c 呼叫python的一些小用法 寫了乙個python指令碼匯入發生異常,可能是編碼問題 如存在中文 python預設的是ascii 可加上 usr bin python coding utf 8 參見 定義類c資料結構 class point structure...
詳解c 與python的互動方式
在平時工作中,需求有多種實現方式 根據不同的需求可以採用不同的程式語言來實現。發揮各種語言的強項 如 python的強項是 資料分析 人工智慧等 net 開發桌面程式介面比python更簡單 方便 美觀 那麼就存在各種語言間互動,本篇主要介紹幾種c 與 python的互動方式。1 ironpytho...
mysql與python的互動
conn connect 引數列表 cursor1 conn.cursor mode表示移動的方式 mode的預設值為relative,表示基於當前行移動到value,value為正則向下移動,value為負則向上移動 mode的值為absolute,表示基於第一條資料的位置,第一條資料位置為零 建...