Рассмотрим следующие функции C:
void AssignPointer(char **p) {
*p = "Test1";
}
char* Return() {
return "Test2";
}
Теперь рассмотрим следующий код в Python:
import ctypes
lib = CDLL('LibraryPathHere')
lib.AssignPointer.restype = None
lib.AssignPointer.argtypes = (ctypes.POINTER(ctypes.c_char_p),)
lib.Return.restype = ctypes.c_char_p
lib.Return.argtypes = None
def to_python_string(c_str : ctypes.c_char_p) -> str:
return c_str.value.decode('ascii')
Теперь работает следующее:
c_str = ctypes.c_char_p()
lib.AssignPointer(ctypes.byref(c_str))
print(to_python_string(c_str))
Однакоследующее дает AttributeError: 'bytes' object has no attribute 'value'
:
c_str = lib.Return()
print(to_python_string(c_str))
В первом случае отладчик показывает c_str
как c_char_p(ADDRESS_HERE)
.Во втором случае отладчик показывает c_str
как b'Test2'
.
Так это ошибка в Python / ctypes или я что-то не так делаю?