我正在用ctypes在Python中创建一个C库的接口,我有一个C函数通常返回一个char**(C字符串数组),但在出现错误时返回NULL。我不知道返回的数组的长度,最后一个条目将为NULL。我尝试了多种重新类型:
restype = POINTER(c_char_p)
restype = POINTER(POINTER(c_char))
当C函数成功返回时,这两种方法都可以正常工作(之后的处理略有不同)。但是当C函数出现错误并返回NULL时,这两个函数都有问题。我希望返回值为None,但实际上是一个get指针,指向以“ValueError:NULL pointer access”结尾的堆栈跟踪的字节字符串
如果C函数成功地将字符**转换为字符串数组,但出现错误时将NULL转换为None,那么该函数的重新类型应该是什么
有两种选择:
c_void_p
结果。如果返回NULL
,它将被强制为None
,否则将其强制转换为POINTER(c_char_p)
以提取字符串李>POINTER(c_char_p)
提取字符串。用try/except
换行并在ValueError
上返回None
李>两种方法都有效。我更喜欢使用包装器使函数按预期的方式运行,并且它可以确保如果动态分配字符串,那么一旦提取为Python字符串,它们就会被释放
例如:
test.c
test.py
输出:
相关问题 更多 >
编程相关推荐