python與C互動中傳入與讀取記憶體空間

2022-07-03 23:12:15 字數 1660 閱讀 2772

使用用python呼叫c**中,從外部傳入乙個固定大小的記憶體空間,這段記憶體需要是可寫的

首先看下c中的函式

typedef struct modeldata

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