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 终止的?
UPDATE 我确实查看了几个相关的问题,但找不到直接的问题来处理相同的问题。非常感谢
你想的没错。该代码有效。调用,例如:
setParameters(['abc','def','ghi'])
我没有查看源代码,但是 ctypes
on Python 2.7(32 位)确实通过了内部 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']
。
我在 Python 2.7 中有一个字符串数组,我想通过 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
on Python 2.7(32 位)确实通过了内部 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']
。