最近在做linux下用python呼叫so庫,出現了一個問題,望各位大神幫忙解決。
問題描述:
動態庫的一個介面如下:int F_VerifyMatch(BioAPI_HANDLE ModuleHandle,BioAPI_BIR_PTR CapturedBIR,BioAPI_BIR_PTRStoredBIR,BioAPI_BOOL *Result,BioAPI_FAR_PTR FARAchieved);
這個介面是一個比對函式,功能為比對引數2和引數3的資料是否是同一個人的特征資料,其中引數2是現場采集的資料(capture),引數3是已經注冊的資料。其中發生問題的是第2和第3個引數,這兩個引數都是一個結構體指標,資料為二進制資料,呼叫該介面時python代碼如下,代碼中filedata1,fsize1和filedata2,fsize2分別是引數2和引數3的資料以及資料長度:
p1 = create_string_buffer(filedata1,fsize1)
p2 = create_string_buffer(filedata2,fsize2)
uiRet3 = -1
result = c_uint(999)
far = c_uint(0)
uiRet3 = dll.F_VerifyMatch(handle,p1,p2,byref(result),byref(far))
上述代碼用Python2.7無任何問題,呼叫能夠成功回傳,但是用python3.6呼叫介面時就會報“ Segmentationfault”錯誤;
另外,測驗中還發現一個問題,就是python3時把引數2改為錯誤資料,就不會報“ Segmentationfault”錯誤,只要傳入capture的資料就會出上述錯誤,難道還跟資料有關?但是2種資料都是二進制形式,讀出來的資料也沒問題,找了好幾天原因,一直沒解決,求幫助,萬分感謝。
uj5u.com熱心網友回復:
出現Segmentationfault,說明動態庫中函式運行出現問題了, 最好在動態庫中加日志等方式確認一下問題發生的位置.因為Python2無問題,Python3有問題, 那就對比一下傳入F_VerifyMatch的引數是否相同, 有些引數需要轉換后才能正確傳遞給C函式
uj5u.com熱心網友回復:
嗯,是的。不過因為庫是第三方廠家的,也準備聯系對方加日志了,謝謝!轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/133700.html
標籤:應用程序開發區
