我在
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创建一个可写字符串以传递给非const char *.