国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python與C互相調用的方法詳解

2020-02-16 01:53:36
字體:
來源:轉載
供稿:網友

前言

最近因為工作的需要,在考慮基于udp做一個用于網游戰斗中的數據同步協議,為了前期測試數據,決定先做一個外部的代理tunnel,原理是在server端和client端分別建立網絡轉發proxy,即原來的C/S連接改為兩個proxy之間數據快速傳輸。因為udp庫是用C++寫的代碼,在測試數據的時候需要不斷地修改參數,重新編譯,修改輸出統計數據制表等,不勝其煩,最終決定導出接口由python腳本來進行邏輯調用。下面話不多說,來一起看看詳細的介紹:

C/C++導出到python有多種方法,根據不同的需求,可以使用下面不同的方式:

1、ctypes綁定。ctypes就包含在萬能的python標準庫模塊里面,它可以運行時載入動態鏈接庫(dll,so),在CPython 2.x/3.x和PyPy上都支持。這種方式好處就是不用針對性地用python api寫導出函數,可以直接加載動態鏈接庫的符號表,在python中就可以直接調用了。

2、第三方的python binding。例子有boost-python,實現方式是工具自動化用Python/C api生成一系列C++ wrapper函數。特別適用于大型的庫或引擎導出到python。

3、手動寫python binding函數。如果對Python C api熟悉的話,這種方式應該是最靈活的,讀一遍API文檔就可以使用。理論上效率應該是最好的,但對于我這種python初學者,可能需要花上不少時間。

以之前折騰C函數導出到Lua腳本的經歷,本以為要先研究一番python c api,再搞上半天才能搞定。后面發現python標準庫模塊的ctypes已經非常強大,雖然性能應該是三種方式里面最差的,但在這個最高60fps的tunnel里面,C/Python接口邊界調用的損耗先忽略。跟其他兩種方式設計不一樣的是,ctypes采用的是非入侵式調用接口的方式,不需要修改原來的C接口或者寫一些綁定代碼,直接對編譯出來的動態庫進行調用。ctypes使用過程也是非常愉悅的。

下面介紹下ctypes的使用:

1、加載DLL動態鏈接庫

這里需要注意區分動態鏈接庫函數是使用cdecl還是stdcall的調用約定,分別使用cdll或windll加載動態庫。

例如:

# 加載udp庫函數 udp_server = cdll.LoadLibrary("./udp_server.so") init_udp_server = udp_server.init_udp_server destroy_udp_server = udp_server.destroy_udp_server update_udp_server = udp_server.update_udp_server SendMsg = udp_server.SendMsg SetConnectCallback = udp_server.SetConnectCallback SetDisconnectCallback = udp_server.SetDisconnectCallback SetTimeoutCallback = udp_server.SetTimeoutCallback SetRecvCallback = udp_server.SetRecvCallback

2、數據類型映射

除了ctypes定義的基本數據類型(c_char, c_int, c_double等),還能使用pointer函數轉換成指針類型。對于要導出的網絡庫,設置回調函數是必不可少的,在C++庫里面,回調函數是通過設置一個函數指針完成的,ctypes同樣支持函數指針的聲明。如:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 罗甸县| 大英县| 淮安市| 金昌市| 福安市| 河源市| 赣榆县| 桃源县| 托里县| 新干县| 乡城县| 宣化县| 宝坻区| 天台县| 浙江省| 木里| 海原县| 大埔区| 武冈市| 大名县| 门源| 庆元县| 万州区| 北京市| 紫阳县| 武穴市| 如皋市| 平顶山市| 中西区| 万全县| 元氏县| 日喀则市| 岫岩| 景泰县| 福贡县| 徐汇区| 谷城县| 韶山市| 安福县| 鹤岗市| 乌海市|