透過Ctypes 從Python 呼叫時,C 函數傳回不正確的值
在嘗試利用Ctypes 從Python 呼叫C 函數時,出現不匹配就出現了預期的結果。此函數將給定數字提升為指定的冪,在 C 中直接呼叫時會傳回預期的結果。但是,在 Python 中呼叫它時,獲得了不同的、不正確的值。
共享檔案容納C 函數是使用以下命令產生的:
$ gcc -fPIC -shared -o test.so test.c
在對C 函數配置進行一些排列之後,在某些情況下確實返回了預期值,表明問題確實存在並非源自C 程式碼中的固有缺陷。值得注意的是,當函數被簡化為計算一個簡單的平方(即傳回 x*x 而不是使用 for 迴圈)時,Python 傳回了正確的結果。
最終目標是存取二維 C Python 中的陣列。
#include <stdio.h> float power(float x, int exponent) { float val = x; for(int i=1; i<exponent; i++){ val = val*x; } return val; }
from ctypes import * so_file = '/Users/.../test.so' functions = CDLL(so_file) functions.power.argtype = [c_float, c_int] functions.power.restype = c_float print(functions.power(5,3))
從 C 呼叫函數時,觀察到預期輸出 125.0。然而,Python 卻產生了 0.0 的值。
經過進一步調查,發現差異是由於在 Python 中指定 C 函數的參數類型時出現錯誤而導致的。無意中使用了錯誤拼字的 argtype,而不是 argtype。
functions.power.argtypes = [c_float, c_int]
修正此拼字錯誤後,從 Python 呼叫函數時成功傳回正確的值 (125.0)。
以上是為什麼使用 ctypes 從 Python 呼叫我的 C 函數時傳回不正確的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!