繁体   English   中英

Python ctypes:传递字符串数组

[英]Python ctypes: Passing an array of strings

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

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 结尾的?

更新我确实查看了几个相关的问题,但找不到直接的问题来处理相同的问题。 非常感谢

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

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

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

我需要对setParameters python 函数中的for循环进行以下调整

for i, param in enumerate(strParamList):
   if isinstance(param, bytes):
      strArray[i] = c_char_p(param)
   else:
      strArray[i] = c_char_p(param.encode('utf-8'))

如果setParameters的数组参数是[b'abc', b'def']['abc','def']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM