2012-02-24 87 views
3

从出口的.so C函数返回我有一个liba.so包含函数say_hi()检索`字符*`从Python中

char *say_hi() 
{ 
    return "hello, world"; 
} 

在Python中,我通过​​访问liba.so

>>>liba = ctypes.CDLL("./liba.so") 
>>>liba.say_hi() 
16422018 

如何检索Python中liba.say_hi()返回的字符串"hello, world"

PS

此外restype,任何其他方式?

+0

http://docs.python.org/library/ctypes.html#return-types – Matthias 2012-02-24 08:19:19

回答

2

的Python的ctypes的模块的文档提供的类型转换功能。例如。 c_char_p

表示指向零终止字符串时的C char *数据类型。对于也可指向二进制数据的通用字符指针,必须使用POINTER(c_char)。 构造函数接受一个整数地址或一个字节对象。

那么试试这个:

ctypes.c_char_p(liba.say_hi()) 

PS:它建立不可改变的字符串。对于易变的看看create_string_buffer 页面上也有一些自描述的exameple。

+0

非常爱你,没错。 :-) – Alcott 2012-02-24 08:27:05

3
+0

确实如此。 :-),除了'restype',还有其他方法吗? – Alcott 2012-02-24 08:20:34

+0

为什么有必要? Python不能从C中推断出类型。最好的答案就是告诉python返回类型是什么。这可能是几乎所有情况下最好的方法。 – Matimus 2012-02-24 08:24:34

+0

谢谢,只是寻求其他方式来完成这项工作,似乎这是最好的方法。 – Alcott 2012-02-24 08:25:34