摘要:問題近日在做一組聲紋聚類時,使用了另一團(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
摘要:調(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)...
摘要:最近了解了提供的一個外部函數(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...
摘要:科大訊飛的語音識別客戶端提供了下的語言,卻沒有的。有了,我們就可以很輕松的用來使用科大訊飛的語音識別了。通過函數(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...
摘要:上篇文章我許了一個愿,就是想讓大家多多關(guān)注我,然后我的粉絲就蹭蹭的漲了好幾百,謝謝大家的厚愛。可是我發(fā)現(xiàn)粉絲是漲了,三連變少了,謝謝大家這次給我三連,我一定再接再厲。地址的尋找陽光總值,種植一個豌豆需要,非常不夠用。 目錄 前言 游戲的安裝 思路 ? ? ? 一句話總結(jié) ? ? ? 大概的思...
摘要:項目地址本篇主要關(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...
閱讀 949·2021-11-23 09:51
閱讀 1012·2021-11-18 10:02
閱讀 1945·2021-09-10 11:27
閱讀 3159·2021-09-10 10:51
閱讀 794·2019-08-29 15:13
閱讀 2079·2019-08-29 11:32
閱讀 2513·2019-08-29 11:25
閱讀 3059·2019-08-26 11:46