Я пытаюсь отправить 2 строки из Python (3.2) в C, используя ctypes. Это небольшая часть моего проекта на моей малиновой пи. Чтобы проверить, правильно ли выполнялась функция C, я помещаю один из них в текстовый файл.Преобразование строкового объекта python в c char * с использованием ctypes
Python код
string1 = "my string 1"
string2 = "my string 2"
# create byte objects from the strings
b_string1 = string1.encode('utf-8')
b_string2 = string2.encode('utf-8')
# send strings to c function
my_c_function(ctypes.create_string_buffer(b_string1),
ctypes.create_string_buffer(b_string2))
код C
void my_c_function(const char* str1, const char* str2)
{
// Test if string is correct
FILE *fp = fopen("//home//pi//Desktop//out.txt", "w");
if (fp != NULL)
{
fputs(str1, fp);
fclose(fp);
}
// Do something with strings..
}
Проблема
Только первая буква строки появится в текстовом файле.
Я пробовал много способов конвертировать строковый объект Python с ctypes.
- ctypes.c_char_p
- ctypes.c_wchar_p
- ctypes.create_string_buffer
С помощью этих преобразований я получаю ошибку "неверный тип" или «байт или целое адрес ожидается вместо экземпляра ул ».
Надеюсь, кто-то скажет мне, где это происходит. Спасибо заранее.
Установите 'my_c_function.argtypes = [ctypes.c_char_p, ctypes.c_char_p]'. Затем, поскольку параметры 'const', просто назовите его как' my_c_function (b_string1, b_string2) '. – eryksun
FYI, буквальный символ обратной косой черты должен быть экранирован как '' \\ "', но это не требуется для косой черты. Это просто '' /home/pi/Desktop/out.txt''. – eryksun
@eryksun Спасибо за ваш ответ. Теперь он работает, я совершенно забыл, что у меня были argtypes, все еще установленные на c_wchar_p. Что касается косых черт, я всегда их смешиваю. – LittleOne