成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

python中使用ctypes調(diào)用so傳參設(shè)置

BigNerdCoding / 835人閱讀

摘要:問題近日在做一組聲紋聚類時,使用了另一團(tuán)隊同學(xué)開發(fā)的聲紋距離算法。該算法對外提供的是一組包,需要使用方自己去使用。本次使用過程中,就遇到傳參的問題。修改后代碼如下結(jié)論中傳遞指針類型參數(shù)需要顯式聲明函數(shù)的參數(shù),返回類型。

問題

近日在做一組聲紋聚類時,使用了另一團(tuán)隊同學(xué)開發(fā)的聲紋距離算法。該算法對外提供的是一組so包,需要使用方自己去使用。在python中調(diào)用純so包一般使用ctypes類庫,用起來看起來簡單但也有不少細(xì)節(jié)容易犯錯。本次使用過程中,就遇到傳參的問題。

目標(biāo)so庫中對外export的函數(shù)是大致如下的三個函數(shù):

    void* create_handler();
    int extract_feature(void* hander);
    bool destroy(void* handler); 

這三個函數(shù)使用起來倒也簡單,順序使用就可以了。但發(fā)現(xiàn)寫成如下形式的python代碼后,執(zhí)行會直接segment fault。

    import sys
    import ctypes
    
    so = ctypes.CDLL("./lib/libbase.so")
    p = so.create_handler()
    feature = so.extract_feature(p)
    so.destroy(p)
解決

這段代碼中p是int類型,由void*自動轉(zhuǎn)來,在ctyeps中這種轉(zhuǎn)型本身是沒問題的。segment fault發(fā)生在extract_feature函數(shù)調(diào)用中,問題應(yīng)當(dāng)出在參數(shù)上,回傳的handler已經(jīng)不是原來的pointer了,導(dǎo)致訪問指針出錯。

查閱ctypes的文檔后,發(fā)現(xiàn)ctypes可以聲明so庫中函數(shù)的參數(shù),返回類型。試了試,顯式聲明后問題得到了解決,證明我們的猜想是對的,確實指針發(fā)生了變化。修改后代碼如下:

    import sys
    import ctypes
    
    so = ctypes.CDLL("./lib/libbase.so")
    so.create_handler.restype=ctypes.c_void_p
    so.extract_feature.argtypes=[ctypes.c_void_p]
    so.destroy.argtypes=[ctypes.c_void_p]
    
    p = so.create_handler()
    feature = so.extract_feature(p)
    so.destroy(p)
結(jié)論:
ctypes中傳遞指針類型參數(shù)需要顯式聲明c函數(shù)的參數(shù),返回類型。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44088.html

相關(guān)文章

  • Python 調(diào)用 C 動態(tài)鏈接庫,包括結(jié)構(gòu)體參數(shù)、回調(diào)函數(shù)等

    摘要:調(diào)用以回調(diào)函數(shù)地址為參數(shù)的函數(shù)這個主題就稍微繞一些了,也就是說在接口中,需要傳入回調(diào)函數(shù)作為參數(shù)。這個問題在中也可以解決,并且回調(diào)函數(shù)可以用定義。代碼代碼很簡單回調(diào)函數(shù)的傳入?yún)?shù)為,返回參數(shù)也是。 項目中要對一個用 C 編寫的 .so 庫進(jìn)行邏輯自測。這項工作,考慮到靈活性,我首先考慮用 Python 來完成。 研究了一些資料,采用 python 的 ctypes 來完成這項工作。已經(jīng)...

    NickZhou 評論0 收藏0
  • Python 外部函數(shù)調(diào)用ctypes簡介

    摘要:最近了解了提供的一個外部函數(shù)庫它提供了語言兼容的幾種數(shù)據(jù)類型,并且可以允許調(diào)用編譯好的庫。這里是閱讀相關(guān)資料的一個記錄,內(nèi)容大部分來自官方文檔。注意,提供的接口會在不同系統(tǒng)上有出入,比如為了加載動態(tài)鏈接庫,在上提供的是而在上提供的是和。 參考資料 https://docs.python.org/2.7/l... http://www.ibm.com/developerw... c...

    mykurisu 評論0 收藏0
  • Pythonctypes調(diào)用動態(tài)庫的方式使用科大訊飛語音識別

    摘要:科大訊飛的語音識別客戶端提供了下的語言,卻沒有的。有了,我們就可以很輕松的用來使用科大訊飛的語音識別了。通過函數(shù)加載動態(tài)庫在里面調(diào)用函數(shù)時主要是注意參數(shù)的類型。 ctypes 是 Python 的一個模塊,它提供了C語言相關(guān)的數(shù)據(jù)類型,可以方便的調(diào)用C語言編寫的DLL(Windows 動態(tài)鏈接庫)和so(Linux動態(tài)鏈接庫)??拼笥嶏w的語音識別客戶端SDK提供了Linux下的C語言S...

    andycall 評論0 收藏0
  • 不要迷戀我,我只是利用Python修改了游戲內(nèi)存

    摘要:上篇文章我許了一個愿,就是想讓大家多多關(guān)注我,然后我的粉絲就蹭蹭的漲了好幾百,謝謝大家的厚愛。可是我發(fā)現(xiàn)粉絲是漲了,三連變少了,謝謝大家這次給我三連,我一定再接再厲。地址的尋找陽光總值,種植一個豌豆需要,非常不夠用。 目錄 前言 游戲的安裝 思路 ? ? ? 一句話總結(jié) ? ? ? 大概的思...

    ermaoL 評論0 收藏0
  • PyTips 0x14 - Python 描述符

    摘要:項目地址本篇主要關(guān)于三個常用內(nèi)置方法,,在語言的設(shè)計中,通常的語法操作最終都會轉(zhuǎn)化為方法調(diào)用,例如相當(dāng)于中的描述符就是將對象屬性的獲取賦值以及刪除等行為轉(zhuǎn)換為方法調(diào)用的協(xié)議例如我們要獲取一個對象的屬性,可以通過的方式取得而通過的 項目地址:https://git.io/pytips 本篇主要關(guān)于三個常用內(nèi)置方法:property(),staticmethod(),classmethod...

    since1986 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<