У меня есть следующая простая функция C:

void pyentry(const char *config)
{
    printf("%s\n",config);
    fflush(stdout);
}

Мое определение ctypes выглядит следующим образом:

libc = ct.CDLL("./amr.so")
entry = wrap_function(libc, 'pyentry', ct.POINTER(Checkpoint), [ct.c_wchar_p])
json = "this is a test"
start = entry(json)

Где wrap_function - это просто оболочка для более простого определения доступа ctypes к функциям C:

def wrap_function(lib, funcname, restype, argtypes):
    func = lib.__getattr__(funcname)
    func.restype = restype
    func.argtypes = argtypes
    return func

Я скомпилировал как разделяемую библиотеку и пытаюсь вызвать ее, но в C он печатает только первый символ строки, которую я отправляю. Я предполагаю, что это потому, что у меня неправильный аргумент tpyes в моем определении ctypes, но Мне не удалось найти правильный.

Может ли кто-нибудь сказать мне, почему моя функция C видит только первый символ в переданной строке?

0
KBriggs 23 Фев 2021 в 23:19

1 ответ

Лучший ответ

Пытаться:

entry = wrap_function(libc, 'pyentry', None, [ct.POINTER(ct.c_char)])
json = "this is a test".encode('utf-8')

pyentry берет const char* и возвращает void. Итак, argtypes и restype могут быть [ct.POINTER(ct.c_char)] и None.

И char* указывает последовательность байтов, а не строку Python. Поэтому json следует преобразовать в байты.

1
ghchoi 24 Фев 2021 в 16:36