gt6*_*89b 5 c python arrays string ctypes
我在 Python 2.7 中有一个字符串数组,我想通过以下方式将其传递给 C 函数ctypes:
unsigned int SetParams(unsigned int count, const char **params)
Run Code Online (Sandbox Code Playgroud)
所以我可以在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)]
Run Code Online (Sandbox Code Playgroud)
但是现在当我在 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)
Run Code Online (Sandbox Code Playgroud)
我刚刚开始ctypes并想知道是否有更自动化的方法来做到这一点?分配strArray[i] = param实际上是否正在重新分配?如果是这样,这似乎很昂贵——有没有办法只将字符串指针指向 Python 分配的缓冲区,或者它们不是以 NULL 结尾的?
更新我确实查看了几个相关的问题,但找不到直接的问题来处理相同的问题。非常感谢
你想得对。该代码有效。调用,例如:
setParameters(['abc','def','ghi'])
Run Code Online (Sandbox Code Playgroud)
我没有看过源代码,但是ctypes在Python 2.7(32位)上确实传递了内部Python缓冲区(通过修改C函数中传递的字符串并在Python中调用后打印它来测试),这就是为什么你应该仅将如上所述的 Python 字符串传递给接受const char*或至少已知不会修改字符串的函数。由于 Python 字符串是不可变的,所以在 C 下写入它们是禁忌。用于ctypes.create_string_buffer创建可写字符串以传递给 non-const char*。