使用ctypes从python引用C代码的麻烦

时间:2019-05-06 12:58:40

标签: python pointers ctypes

我试图创建一个共享的C语言库,以供Python引用。主要问题是我只能在C中获取指向数组的返回指针的地址。我试图从C函数发送的返回地址中读取值。但是,我尝试的每种方法都会导致Python失败,并且无法访问该值。有没有人可以提供一些建议?

path='../crypto_lib/vrf.so'

lib=CDLL(path)
sk = lib.new_sk()
print(sk)

output:292500480

这是我要使用的C代码,它生成一个密钥并以转换后的十六进制类型返回并存储在shexbuf中。代码不是我自己的工作,它模仿了github上的一些示例,在使用C进行编译时可以很好地工作。给出预期的输出

char* new_sk(){

    uint8_t public_key[crypto_sign_PUBLICKEYBYTES];

    uint8_t secret_key[crypto_sign_SECRETKEYBYTES];

    static char shexbuf[2*crypto_sign_SECRETKEYBYTES+1];

    crypto_vrf_keypair(public_key, secret_key);
    char* result;
    result = to_hex(shexbuf, secret_key,  crypto_sign_SECRETKEYBYTES);
    return shexbuf;

}

我希望得到秘密密钥的价值, 但我只能得到一些似乎是地址。 当我尝试使用ctype从地址中读取值时,python退出窗口意外弹出

1 个答案:

答案 0 :(得分:0)

ctypes的参数和返回值默认为c_int。您将看到返回的字符串的地址为c_int。适当设置.restype

lib=CDLL(path)
lib.new_sk.restype = c_char_p
sk = lib.new_sk()
print(sk)