簡體   English   中英

如何使用ctypes從Python代碼獲取char指針的值

[英]How to get value of char pointer from Python code wtih ctypes

我想在Python上使用C庫。 然后,我想從C庫功能獲取消息(char *)。

我寫了這些代碼。 我得到了結果值(double * result_out),但沒有收到消息。 此代碼顯示為“ c_char_p(None)”。

有任何想法嗎?

我使用Python 3.6和Ubuntu Bash。

C(libdiv.so):

#define ERROR -1
#define OK     0

int div (double x, double y, char *msg, double *result_out) {
    static char *err_msg = "0 div error"; 
    if(y == 0) {
        msg = err_msg;
        return ERROR;
    }
    *result_out = x/y;
    return OK;
}

蟒蛇:

from ctypes import *

lib = cdll.Loadlibrary('libdiv.so')
errmsg = c_char_p()
result = c_double(0)
rtn = lib.div(10, 0, errmsg, byref(result))

if rtn < 0:
    print (errmsg)       # None    
else :
    print (result.value) # OK.

這里的主要問題是您的C被破壞了。 msg參數賦值並不會在調用者端產生任何可見的效果(就像您試圖在Python函數中為參數賦值一樣)。

如果您想將錯誤消息字符串實際提供給div的調用者,則需要使用char**而不是char* ,並將其分配給*msg 在Python端,您將傳遞諸如byref(errmsg)

除此之外,您需要在lib.div上設置argtypesrestype ,否則Python將不知道如何正確傳遞參數。

要將值作為輸出參數返回,您需要將指針傳遞給返回的值類型。 就像您使用double*來接收一個double一樣,您需要一個char**來接收一個char*

#ifdef _WIN32
#   define API __declspec(dllexport)
#else
#   define API
#endif

#define OK     0
#define ERROR -1

API int div(double x, double y, char** ppMsg, double* pOut)
{
    static char* err_msg = "0 div error";
    if(y == 0)
    {
        *ppMsg = err_msg;
        return ERROR;
    }
    *pOut = x / y;
    return OK;
}

在Python中,您還需要聲明參數類型,否則默認情況下Python會將值作為c_int送給C,這將導致double並且可能會破壞char*具體取決於操作系統的指針實現:

from ctypes import *

lib = CDLL('test')
lib.div.argtypes = c_double,c_double,POINTER(c_char_p),POINTER(c_double)
lib.div.restype  = c_int

errmsg = c_char_p()
result = c_double()
rtn = lib.div(10, 0, byref(errmsg), byref(result))

if rtn < 0:
    print(errmsg.value)
else:
    print(result.value)

輸出:

b'0 div error'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM