使用ctypes从Python向C发送包含可变字符串的结构

时间:2012-04-04 07:21:30

标签: python ctypes

我的结构包含C侧的字符数组

stuct s
{
    int x;
    char buffer[100];
}

在我的python端我定义

class myS(ctypes.Structure):
    _fields_ = [("x", c_int),
         ("buffer",type(create_string_buffer(100)))]

现在,当我做

buf = create_string_buffer(64)
s1 = myS(10,buf)

它给了我错误

TypeError: expected string or Unicode object, c_char_Array_100 found

我想要一个将由我的C函数更改的字符串。怎么做?

2 个答案:

答案 0 :(得分:1)

您可以将常规Python字符串分配给100 * c_char字段:

class myS(ctypes.Structure):
    _fields_ = [("x", c_int),
         ("buffer", 100*c_char)]

s1 = myS(10, "foo")
s1.buffer = "bar"

但是,如果您有一个字符串缓冲区对象,则可以使用其值:

buf = create_string_buffer(64) 
s1 = myS(10,buf.value)

另请注意

>>> type(create_string_buffer(100)) == 100*c_char
True

答案 1 :(得分:1)

您不必创建缓冲区。实例化缓冲区时,缓冲区就在结构中。

这是一个快速的DLL:

#include <string.h>

struct s
{
    int x;
    char buffer[100];
};

__declspec(dllexport) void func(struct s* a)
{
    a->x = 5;
    strcpy(a->buffer,"here is the contents of the string.");
}

这是调用它的Python代码:

import ctypes

class myS(ctypes.Structure):
    _fields_ = [
        ("x", ctypes.c_int),
        ("buffer",ctypes.c_char * 100)]

s1 = myS()
dll = ctypes.CDLL('test')
dll.func(ctypes.byref(s1))
print s1.buffer
print s1.x

输出:

here is the contents of the string.
5