使用ctypes将字符串从Python传递到C共享库的问题

2024-10-04 01:31:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我很难通过ctypes将字符串从Python传递到C:

我的C代码(编译成你好。所以)在

...
typedef struct test{
    unsigned int    a;
    unsigned char*  b;
} my_struct;

int hello(my_struct *in) {
    FILE *fp;
    ...
    fprintf(fp, "%d\t%s\n", in->a, in->b);
    fclose(fp);
    return 0;
}

我的Python代码:

^{pr2}$

我得到了一个错误: hello_args=测试结构(1,名称) TypeError:应为字符串,但找到c\u char_数组_5

我试图将c_char_p更改为c_wchar_p或c_char*5或c_wchar*5等。有时它可以正常运行,结构的第一个int参数可以正确打印,但不能打印第二个字符串指针,我只能得到第一个字符“t”而不是整个单词“test”。在

顺便说一句,我的python3版本是3.3.0


Tags: 字符串代码intesthellomyctypes结构
1条回答
网友
1楼 · 发布于 2024-10-04 01:31:20

解决方案取决于您是否需要数据类型是可变的(从Python的角度来看)。在

如果不需要数据是可变的,那么就不用担心缓冲区构造函数了。只需将bytes对象直接传递给TEST_STRUCT构造函数。例如

from ctypes import *

class TEST_STRUCT(Structure):
    _fields_ = [("a", c_int),
                ("b", c_char_p)]

hello_args = TEST_STRUCT(1, b"test")

如果需要可变缓冲区,则需要在TEST_STRUCT类中以稍微不同的方式指定char*类型。例如

^{pr2}$

c_char_pPOINTER(c_char)

表面上看,虽然这两个看起来相似,但却有细微的不同。POINTER(c_char)用于char数据的任何缓冲区。c_char_p专门用于以NULL结尾的字符串。作为这个条件的一个副作用,所有c_char_p对象都是不可变的(在python方面),以便使这个保证更容易实施。例如,{65, 66, 67, 0}是一个字符串("ABC"),而{}则不是。在

相关问题 更多 >