最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python與C互相調(diào)用的方法詳解

 更新時間:2017年07月14日 10:18:38   作者:人在廣州_2017  
這篇文章主要給大家介紹了關(guān)于python與C互相調(diào)用方法的相關(guān)資料,文中通過示例代碼詳細(xì)介紹了動用的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

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

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

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

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

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

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

下面介紹下ctypes的使用:

1、加載DLL動態(tài)鏈接庫

這里需要注意區(qū)分動態(tài)鏈接庫函數(shù)是使用cdecl還是stdcall的調(diào)用約定,分別使用cdll或windll加載動態(tài)庫。

例如:

# 加載udp庫函數(shù) 
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、數(shù)據(jù)類型映射

除了ctypes定義的基本數(shù)據(jù)類型(c_char, c_int, c_double等),還能使用pointer函數(shù)轉(zhuǎn)換成指針類型。對于要導(dǎo)出的網(wǎng)絡(luò)庫,設(shè)置回調(diào)函數(shù)是必不可少的,在C++庫里面,回調(diào)函數(shù)是通過設(shè)置一個函數(shù)指針完成的,ctypes同樣支持函數(shù)指針的聲明。如:recv_cb = CFUNCTYPE( None, c_char_p, c_int ) ,表示一個返回值為void,參數(shù)為char*和int類型的回調(diào)函數(shù)。

def __init__(self, port, ip="127.0.0.1"): 
  self._port = port 
  self._ip = ip 

  self._clients = {} 

  self.c_connect_cb = connect_cb(self.server_connect) 
  self.c_disconnect_cb = disconnect_cb(self.server_disconnect) 
  self.c_timeout_cb = timeout_cb(self.server_timeout) 
  self.c_recv_cb = recv_cb(self.server_recv) 

def create(self): 
  if self._port: 
   if init_udp_server(self._ip, self._port) == 0: 
    print "server listen %s:%d" % (self._ip, self._port) 
    SetConnectCallback( self.c_connect_cb ) 
    SetDisconnectCallback( self.c_disconnect_cb ) 
    SetTimeoutCallback( self.c_timeout_cb ) 
    SetRecvCallback( self.c_recv_cb ) 
    return True 
  print "[error] init_udp_server error", self._ip, self._port 
  return False

綁定回調(diào)參數(shù)需要注意的是,綁定的回調(diào)函數(shù)需要保存為成員變量(上面的寫法),目的是避免python垃圾回收導(dǎo)致回調(diào)函數(shù)變成野指針。這算是一個小小的坑吧?;旧弦粋€小小的庫也就用到這些功能。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 使用Python實現(xiàn)漢諾塔問題示例

    使用Python實現(xiàn)漢諾塔問題示例

    這篇文章主要介紹了使用Python實現(xiàn)漢諾塔問題示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • matplotlib繪制雷達(dá)圖的基本配置(萬能模板案例)

    matplotlib繪制雷達(dá)圖的基本配置(萬能模板案例)

    本文主要介紹了matplotlib繪制雷達(dá)圖的基本配置(萬能模板案例),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Python實現(xiàn)名片管理系統(tǒng)

    Python實現(xiàn)名片管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Python實現(xiàn)名片管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 淺談一下Python中的with用法

    淺談一下Python中的with用法

    這篇文章主要介紹了淺談一下Python中的with用法,有一些任務(wù),可能事先需要設(shè)置,事后做清理工作。對于這種場景,Python的with語句提供了一種非常方便的處理方式,需要的朋友可以參考下
    2023-04-04
  • 通過代碼實例了解Python3編程技巧

    通過代碼實例了解Python3編程技巧

    這篇文章主要介紹了通過代碼實例了解Python3編程技巧,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • Python爬豆瓣電影實例

    Python爬豆瓣電影實例

    本篇文章給大家通過Python爬豆瓣電影實例對Python爬蟲更深入的講解,有興趣的學(xué)習(xí)下。
    2018-02-02
  • Django自定義YamlField實現(xiàn)過程解析

    Django自定義YamlField實現(xiàn)過程解析

    這篇文章主要介紹了Django自定義YamlField實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • python第三方庫easydict的使用實例詳解

    python第三方庫easydict的使用實例詳解

    在?Python?中當(dāng)我們需要訪問字典中的元素的時候,我們需要使用類似?a['example']?的形式來進(jìn)行使用,這個時候就可以使用 easydict 這個模塊了,今天通過本文給大家講解python第三方庫easydict的使用,感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • python熱力圖實現(xiàn)簡單方法

    python熱力圖實現(xiàn)簡單方法

    在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于python熱力圖實現(xiàn)簡單方法,對此有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • Python趣味編程實現(xiàn)手繪風(fēng)視頻示例

    Python趣味編程實現(xiàn)手繪風(fēng)視頻示例

    本文與計算機(jī)視覺相關(guān),使用Python將圖片由自然風(fēng)轉(zhuǎn)化為手繪風(fēng),期間未對圖片進(jìn)行任何預(yù)處理、后處理;代碼中只借助了兩個常見庫,核心計算由Numpy負(fù)責(zé) ,Pillow 負(fù)責(zé)圖片讀寫
    2021-10-10

最新評論

盖州市| SHOW| 紫阳县| 永济市| 聊城市| 建平县| 商南县| 班玛县| 迭部县| 乌鲁木齐县| 泗洪县| 镶黄旗| 当涂县| 怀安县| 贺州市| 东乡族自治县| 兴化市| 宾川县| 厦门市| 绥化市| 惠安县| 侯马市| 友谊县| 乌鲁木齐市| 康保县| 霍州市| 章丘市| 南溪县| 肇州县| 阿图什市| 许昌市| 饶河县| 仙桃市| 汝州市| 弋阳县| 社旗县| 昭觉县| 洛浦县| 明星| 文化| 赤壁市|