gpt4 book ai didi

python - ctypes 和字符串

转载 作者:太空狗 更新时间:2023-10-29 18:04:04 24 4
gpt4 key购买 nike

我有一个简单的 C 文件:

char* initializetest() {
char * test = malloc(1000);
return test;
}

int searchtest( char* test )
{
strcpy(test,"test");
return 0;
}

main()
{
char *test = initializetest();
searchtest(test);
printf("%s\n", test );
}

和python文件:

from ctypes import *

class Test(object):
def __init__(self):
self.test_library=CDLL("test.so")
self.test_initialize = self.test_library.initializetest
self.test_search = self.test_library.searchtest
self.test_search.restype=c_int
self.m = self.test_initialize()

def search(self):
self.test_search(self.m)
print self.m

r = Test()
print r.search()

如何在 python 中获取“测试”字符串?

最佳答案

from ctypes import *

charptr = POINTER(c_char)

test = CDLL('test.so')
test.initializetest.argtypes = []
test.initializetest.restype = charptr
test.searchtest.argtypes = [charptr]
test.searchtest.restype = c_int

buf = test.initializetest()
test.searchtest(buf)
print cast(buf, c_char_p).value
# TODO Release the "buf" memory or it will leak.

编辑

最初我使用 c_char_p 在函数之间传递缓冲区,但 c_char_p 就像一个 const 指针。如果用作 restype,您实际上会得到一个 Python str。因此,对于 initializetest,它将从分配的内存中创建一个字符串(通过复制数据)并丢弃指针。

现在我们正在创建一个新类型,一个指向c_charPOINTER。然后在两个函数中使用它。

对于 Python,此类型指向单个字符,因此我们必须在 searchtest 完成后对其进行转换以获取整个字符串。我们转换为 c_char_p 因为我们只想读取值,所以 const 指针就可以了。

作为旁注,这说明了将 c_char_p 与修改数组的函数一起使用的灾难性后果(如上面的 searchtest 所做的那样):

>>> libc.memset.argtypes = [c_char_p, c_int, c_int]
>>> foo = 'Python'
>>> foo
'Python'
>>> libc.memset(foo, ord('x'), 3)
44808532
>>> foo
'xxxhon'
>>>

请注意我们是如何设法改变一个不可变的 Python 字符串的!

甚至不需要 argtypes 设置行,因为如果将 Python str 用作争论。

关于python - ctypes 和字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8447308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com