国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python中使用ctypes調用so傳參設置

BigNerdCoding / 822人閱讀

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

問題

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

目標so庫中對外export的函數是大致如下的三個函數:

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

這三個函數使用起來倒也簡單,順序使用就可以了。但發現寫成如下形式的python代碼后,執行會直接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*自動轉來,在ctyeps中這種轉型本身是沒問題的。segment fault發生在extract_feature函數調用中,問題應當出在參數上,回傳的handler已經不是原來的pointer了,導致訪問指針出錯。

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

    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)
結論:
ctypes中傳遞指針類型參數需要顯式聲明c函數的參數,返回類型。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44088.html

相關文章

  • Python 調用 C 動態鏈接庫,包括結構體參數、回調函數等

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

    NickZhou 評論0 收藏0
  • Python 外部函數調用ctypes簡介

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

    mykurisu 評論0 收藏0
  • Pythonctypes調用動態庫的方式使用科大訊飛語音識別

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

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

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

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

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

    since1986 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<