c调python_应该是史上最全的python调用C接口
在這段時間里,我需要使用python調用C接口。我在網上搜索了很多,再加上python的官方文件,并組織備份1。從ctypes加載dll導入* dll = () # func1dll = CDLL () # func2print (dll) 2。type3的數據通信。函數調用CDLL1_API int fnDLL1 (void){返回42;}Pythonprint (()) 4。參數傳遞CDLL1_API int fnDLL2 (int,浮動b,雙c, const char *緩沖區,int研發){printf (\時您可以使用byref(臨時)Pythontemp = c_int(0)打印((1,c_float (), c_double (),\u2018hell0 .
例如,指針(臨時)type_p_int =指針(c_int) temp = type_p_int (c_int(0))打印((1,c_float (), c_double (),\u2018hell0 .encode (gbk)、臨時))打印(int *,臨時,臨時[0])返回值int,浮動,雙可以直接接收這些類型,其他類型需要設置接口返回類型CDLL1_API char * fnDLL3 (char * buf){返回緩沖區;}python = c_char_pres = (\u201Chello\u201D.encode (gbk))打印(res,類型(res))如果char *轉移,其內容需要更改,需要事先定義好的存儲空間CDLL1_API int fnDLL4 (char *緩沖區,size_t buffsize){printf (\結構定義我們使用字段= [(name1,類型1)(\u201Cname2\u201D,類型2)]顯示的字節對齊的成員結構。
身體,使用包指定對齊的字節數,定義數組的直接使用* num表明c#編譯指示包裝數量(1)struct MyStruct {int;雙b; char C [32];}; # pragma包()pythonclass MyStruct(結構):_fields_ = [(a, c_int) (b, c_double) (\u201CC\u201D, c_char * 32)] _pack_ = 1比特字段Cstruct MyStruct1 (int: 16;int b: 16;}; pythonclass MyStruct1(結構):_fields_ = [(a c_int 16) (b c_int 16))嵌套結構cstruct MyStruct2 (int, MyStruct S [4];
pythonclass MyStruct2(結構):_fields_ = [(a, c_int)(的struct MyStruct * 4)]通過結構,同前面的參數,指針類型時使用byref或pointercDL L1_API int fnDLL5 (MyStruct & S){printf (\時編碼(gbk) (byref (mystruct))(指針(mystruct))返回的結構,和之前一樣,您需要指定返回類型cDLL1_API mystruct fnDLL6 () {mystruct * tem =新mystruct;返回* tem;} python = MyStructres =()打印(res)打印(\u201Cmystruct:\u2018,,,) del res的高階int數組定義my_array[10][10];
contentsprint (res,類型(res))打印(mystruct:) def包(ctype_instance):返回string_at (addressof (ctype_instance), sizeof (ctype_instance)) def解壓(ctype buf):斷言sizeof (ctype) = = len (buf)裝運箱= create_string_buffer (buf)返回(指針(裝運箱),指針(ctype))。回調函數內容首先使用CFUNCTYPE定義回調函數類型,第一個參數的參數返回值類型以下參數由回調函數傳遞的參數類型,然后定義函數在python中,Ctypedef int (* callbakc) (int, int b);
printf (\常用的,比如通過一個字節流,我們需要通過字節流的長度和一個指針指向第一個地址。如果你直接使用參數,c_void_p int類型。和c_char_p字節到最后' \\ 0 ',最后我們在python中使用string_at來獲得實際的字節流c調typedef無效(* callbakc) (void * buf, int &buf_size);定義在python def回調(buf、大小):字符串= string_at () CALLBACKFUNC = CFUNCTYPE(沒有,c_void_p c_int)調用= CALLBACKFUNC(回調)
總結
以上是生活随笔為你收集整理的c调python_应该是史上最全的python调用C接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php邮件中文乱码,phpmailer
- 下一篇: android 6.0 adb,安卓6.