使用用python呼叫c**中,從外部傳入乙個固定大小的記憶體空間,這段記憶體需要是可寫的
首先看下c中的函式
typedef struct modeldatamodel_data;
int sessionbegin(inst nst, model_data* model_data);
首先再python中定義對應的結構體
class isv_modeldata(structure):_fields_ = [
('model_len', c_uint),
('model_data', c_void_p)
]
雖然c中的結構體是char *,這裡並沒有定義成c_char_p,因為這段記憶體需要支援寫入,並且便於後面讀取。
model_res = model_data()model_len = 1024 * 1024
raw_memory = bytearray(model_len )
ctypes_raw_type = (c_char * model_len )
ctypes_raw_memory = ctypes_raw_type.from_buffer(raw_memory)
# 通過ctypes物件的addressof獲得記憶體指標的值
raw_address = addressof(ctypes_raw_memory)
model_res.model_data = c_void_p(raw_address)
model_res.model_len = model_len
這樣我們就有了一段1024*1024的空白的記憶體空間
ret = so.sessionbegin(inst, byref(model_res))
同樣也可以傳入一段有內容的空間
model_res = model_data()raw_model_data = open('xx', 'rb').read()
raw_memory = bytearray(raw_model_data)
ctypes_raw_type = (c_char * len(raw_model_data))
ctypes_raw_memory = ctypes_raw_type.from_buffer(raw_memory)
# 通過ctypes物件的addressof獲得記憶體指標的值
raw_address = addressof(ctypes_raw_memory)
model_res.model_data = c_void_p(raw_address)
model_res.model_len = len(raw_model_data)
當c中處理完成後,如何讀取裡面的內容,這裡如果c_char_p的話就不好處理了
model_out_value = (c_int8 * model_res.model_len).from_address(model_res.model_data)model_out_value_str = struct.pack("%sb" % model_res.model_len, *model_out_value)
以上都是在python2中進行測試的
python與cad互動 python與C 互動
python和c 能進行有效的互動,c 呼叫python的一些小用法 寫了乙個python指令碼匯入發生異常,可能是編碼問題 如存在中文 python預設的是ascii 可加上 usr bin python coding utf 8 參見 定義類c資料結構 class point structure...
Python與C 資料互動編碼問題
在寫後台的時候遇到乙個需求 我的python後台伺服器需要建立乙個服務端socket跟c 客戶端進行一些資料的互動 出現問題 python socket.recv 1024 接收到的資料是格式不正確的。比如客戶端傳過來的資料格式是 4,10080 服務端接收到的資料格式是 4,1 0 0 8 0 分...
C與Python互動ctype方式記錄
python中封裝了ctype可以用來c與python之間的互動。在vs中選擇動態庫編譯可以將函式編譯成動態庫的形式。下面條件編譯是用來在c 中編譯c的函式,並且匯出成動態庫的。ifdef cplusplus define xext extern c else define xext endif i...