Python ctypes:传递字符串数组

2023-12-27

我在 Python 2.7 中有一个字符串数组,我想通过它传递给 C 函数ctypes:

unsigned int SetParams(unsigned int count, const char **params)

所以我可以在python中定义参数:

import ctypes as ct
lib = ct.cdll.LoadLibrary('...')
lib.SetParams.restype  = ct.c_uint
lib.SetParams.argtypes = [ct.c_uint, ct.POINTER(ct.c_char_p)]

但是现在当我在 Python 函数中得到一组参数时,我想在上面的库调用中使用它,我实际上如何调用它?我在想这样的事情:

def setParameters(strParamList):
    numParams    = len(strParamList)
    strArrayType = ct.c_char_p * numParams
    strArray     = strArrayType()
    for i, param in enumerate(strParamList):
        strArray[i] = param
    lib.SetParams(numParams, strArray)

我刚刚开始ctypes并想知道是否有更自动化的方法来做到这一点?还有任务strArray[i] = param实际上重新分配?如果是这样,这看起来相当昂贵——有没有办法只将字符串指针指向Python分配的缓冲区,或者它们不是以NULL结尾的?

UPDATE我确实浏览了几个相关的问题,但找不到直接的问题来处理相同的问题。非常感谢


你想得对。该代码有效。调用,例如:

setParameters(['abc','def','ghi'])

我没看过源码,不过ctypes在Python 2.7(32位)上确实传递了内部Python缓冲区(通过修改C函数中传递的字符串并在Python中调用后打印它来测试),这就是为什么你应该只将如上所述的Python字符串传递给使用const char*或者至少知道不修改字符串。由于 Python 字符串是不可变的,所以在 C 下写入它们是禁忌。使用ctypes.create_string_buffer创建一个可写字符串传递给非常量char*.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python ctypes:传递字符串数组 的相关文章

随机推荐